OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4253|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ) q$ R2 {" x1 y% X: a9 Z

( \+ [$ {, ?+ M+ V/ oOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
( t- Q% D2 j' y& a# D; @4 X0 f#include <unistd.h>
6 o: b4 C! J2 I#include <sys/mman.h>, H4 t7 T  ?* O& h1 Z2 E$ T
#include <sys/types.h>5 f; g0 l; c( E- t
#include <fcntl.h>
* @- i% V" ]# Y# P; X, U/ U* b3 E  |: M4 s) e2 o' n
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
' P( @. Q& }! N
. @7 V+ Z, x  z, }typedef struct
9 F8 D: J( @  P1 [{
3 b# e* [; @. T0 N' e        unsigned int a;
1 z7 _- a2 L7 F( k# f        unsigned int b;9 G0 y* T; v( y7 I" Z
        unsigned int packet_cout;
# k& `. B0 P8 Y' T1 U) L}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 d# O! }+ ^; T: l" o% O9 O$ W& r" ]3 t9 @3 w- i
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);3 ?( t! L& t5 U6 s
unsigned int count_copy = 0;
* r; ~' ?6 U( Z0 `/ O$ P. p4 Y8 {1 P2 T/ A6 E4 t. T* {' R

9 i* u5 v; m+ sint main()+ \6 v- h" k8 ]* E. A( o! k9 m
{$ h9 m( a, U' G
        pRX_MSG_PROTOCOL pshreRAM = NULL;
% w2 f/ ?  s8 F0 Y0 i% z        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
. x+ |: e7 Q9 g1 b( a3 H1 O6 z+ h* v) U5 T& r8 n5 |7 D. t- T
        while(1)
5 s5 }  r- T: O1 e& N8 g        {2 V/ `, n6 E- A! s! J4 s/ b$ T
                read_MSG_buffer(pshreRAM);
' |3 R, M5 Z: h7 k        }                7 Q8 B; q1 h: p" z
}
; Y2 O) I  E" l4 Z1 C5 }! E
+ W  [6 x6 n) U3 e! a. ?- X; }void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM). k& E! v/ h( e3 L; |
{+ r. ?. n" B; {9 \' d+ l" i
        RX_MSG_PROTOCOL buf;
" g/ v' X, W. [8 |- ]        
! U, J) L" \2 w' m% u/ n        buf.a = pshreRAM->a;
% C; h$ ~2 P6 W3 Y0 ^; [& D4 P        buf.b = pshreRAM->b;
% _# Z% Q/ s5 H2 e, Z" U        buf.packet_cout = pshreRAM->packet_cout;
; q9 R- G' Z& i1 n& g! V& n        
& N. W: ]! r' A$ r" G        if(buf.packet_cout != count_copy)
) \& T; z" x$ p- Z: t5 l8 `        {7 V  }4 n+ T8 r! n
                printf("a is %d\n", buf.a);
3 h; R) ^! B; |' ]! ^2 O# W                printf("b is %d\n", buf.b);
- E( i2 {7 M  n; i4 ?6 Q9 X3 V0 z7 c                printf("count is %d\n", buf.packet_cout);* t" N4 J1 l/ r5 d" v! h
                count_copy = buf.packet_cout;
, a3 L. R5 m+ {4 G8 Q! @9 R% ]        }
9 u+ k- p# |  L& u        else
: p5 p$ P) `) |  P+ L  I        {/ {# Z( g# p$ v8 m
                printf("No effective message!");
5 z; G6 P% `2 [8 ^0 M& [( e        }9 ]3 n8 x. K8 D/ T
}
) L: Q% N! m$ t
! v+ y& u5 r0 D# V) a2 j
1 ^% a  S6 {7 ]. p但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
9 I7 }- ?& R+ q( L, [4 k- p使用下面代码,对内存使用了mmap函数后:+ ?+ q; X) ?8 t8 b$ M: @
#include <stdio.h>
  [  ^9 E/ r. O& ^#include <unistd.h>
3 H0 ?  ]$ O9 }#include <sys/mman.h>
+ r) L8 |" D$ Y; T* v#include <sys/types.h>5 R9 g1 \8 W( j: H
#include <fcntl.h>
5 \% F3 y& k  P8 g! U# q9 R! v5 X$ {! o  d2 r; @% s
#define SHAER_RAM_BASE_ADDR    (0x80000000); `/ V, A6 x  ]
#define SHAER_RAM_SIZE         (0x20000)   
/ a/ e" M- `8 O; d/ w( E- B0 T
: G/ h% N4 v$ l" A8 J) {typedef struct
3 \: Q) c. K/ E' g6 j{
) J0 z( L( n* Z$ y        unsigned int a;
' h/ X) R2 J& ?/ Z        unsigned int b;) A+ H& O8 F- O8 z' J9 ]4 A
        unsigned int packet_cout;
# J7 y4 D1 q) q4 a}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* O+ u  i, k( y* k' Q: o

  j, t, [0 a/ s2 j0 Tvoid read_MSG_buffer(int *baseaddr);$ M8 j9 C( L3 q5 I5 E  }+ g+ g: u
unsigned int count_copy = 0;
1 V  T8 D: }0 F% S) c9 F/ Y5 v2 x: q6 N$ s
int main()
8 l) H$ n: M* j7 z{
8 I9 P  i/ q  `: O9 Q        int fd;: a# l$ M3 D1 T/ P
        int *mem = NULL;
, S% d' \6 @8 r% U( c' C: M9 u4 q% O5 e4 K
        if((fd = open("/dev/mem", O_RDWR)) <0)
3 M+ Z, Q3 r+ c        {
9 }, U8 Z! G; r3 q8 L                perror("open error");$ {0 s# v5 F# F% {1 F
                return -1;
- E% \; |' ]7 {  R        }0 S' l8 T5 X  ^# f4 L" W$ W
        
' K4 g( P; `: w        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);* ~( g2 [6 N9 v1 I7 S4 e/ u
6 i: _  d; B! j9 A" X
        while(1)
% k1 @* e9 k2 {% K        {
& k: a2 w' R7 |                read_MSG_buffer(mem);3 f, C0 u5 d/ N( @7 j% ~
        }               
! Y. a. d9 o# T& g  s" n}
+ m$ s# L" ^, h2 t+ F0 M+ j
' V0 M7 h6 C& y' M$ ivoid read_MSG_buffer(int *baseaddr): P/ N3 Z; v3 Q
{
  t2 a2 o% N6 g# U3 r6 q        pRX_MSG_PROTOCOL pshreRAM = NULL;; K( a; e. Z7 C0 G0 {, C% U  C. P
) e! K, m. o+ x; e4 K* {6 t- K
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
5 A! ~, b9 v& ^# T6 D6 a( x3 i3 b( \  ~0 Q* l' s' o& n; g0 Q
        if(pshreRAM->packet_cout != count_copy)  |9 S/ p& @# d! L; u; n
        {- r  l6 a. l* [% ?' o9 T0 H; ^
                printf("a is %d\n", pshreRAM->a);2 ~" J1 N' E2 ?! B/ y* J8 A
                printf("b is %d\n", pshreRAM->b);
! _$ m+ D) e" s                printf("count is %d\n", pshreRAM->packet_cout);
/ P' p( Q. u9 A- ^1 i9 h                count_copy = pshreRAM->packet_cout;; W) l* Z0 Z$ b' V3 m
        }2 ~2 K4 [) N! |7 b
        else* w2 q  p, g& n7 \
        {, v3 F" R- t# o3 C
                printf("No effective message!\n");
8 z% x# h0 q) G0 t, k2 q        }6 s& A1 ]" Z  m( f5 \7 j' x+ Q4 p
}
0 k% _- z$ \' r- W) s* M: O
" r( E. I/ j. S7 y) l没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
5 i- p( }! k6 _! L# [/ ~' {: W* g0 V

0 E/ I) A1 s- U( t4 S/ d
" k  c2 p2 Y; M5 Y5 X
/ f1 Z% y, b4 K, I" k8 ^# x; w
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2024-5-2 23:02 , Processed in 0.036196 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表