OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ) l3 O, H- V8 _" D$ K
/ ]3 M8 N: P6 {& G$ s6 d: b
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
3 A* M7 g6 {. n#include <unistd.h>
' e5 H6 z8 e" D3 D8 h#include <sys/mman.h>9 c/ m8 t2 }( j! n% n
#include <sys/types.h>, A% ^7 o4 T- _% P* }% D* Z
#include <fcntl.h>0 j1 h' e+ }. B1 p
. M! }+ j! Y0 y$ r1 X
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
6 e& ^# m, v" z7 C6 W9 D6 e; ]* A$ v
typedef struct. r- O9 [* Z: ]" M
{
; I: D( N% n- J1 q( l        unsigned int a;
6 q0 j4 }  _6 C* r& V& K: G        unsigned int b;
! Z- W! y+ B. A( A        unsigned int packet_cout;4 W. L9 X5 \( q& ~! B* A: g2 G
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( @9 u" v5 H5 ?, J8 U
- K) R% ?( f/ W4 Gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);% O' u3 j4 |: C! P7 {% X
unsigned int count_copy = 0;+ `+ d2 ?! ^3 P% g
$ q# ]3 c/ ]- m6 U6 ~/ V

' Z* w; i' @# x6 h/ Cint main()* d! i. E6 u6 J, g. L
{
4 l% l! c9 e) C$ e; _. x        pRX_MSG_PROTOCOL pshreRAM = NULL;+ J( A+ H! L. n, L/ d
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
( U# b' F" k/ P
( a4 r1 h, D  s: k        while(1)
. T) y$ z& l3 @# u7 o        {$ M  U9 X9 R% V) E
                read_MSG_buffer(pshreRAM);: v5 _  p& B( p4 Z
        }                - D! ?- B+ c$ ~2 A3 t1 x: B0 ?
}
* G! p9 D# k7 Q4 @" P$ m! k- U
$ t: b* h; P. xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
. F9 x& S4 ]3 Z8 `0 a. F{9 _1 p2 ]2 r  E8 q+ u2 ]) w/ q
        RX_MSG_PROTOCOL buf;( \% @0 p' n- r6 R& `! F  m
        
* g$ f. n4 i. L4 o' Z2 Q        buf.a = pshreRAM->a;
/ `$ O1 A. [4 _2 M; m- O        buf.b = pshreRAM->b;# M* _+ T7 Y0 D6 ~- q2 j( @. |
        buf.packet_cout = pshreRAM->packet_cout;9 Q$ Y* @! X+ [' q& `3 f8 B; B
        
$ M5 [0 E5 p+ l1 l        if(buf.packet_cout != count_copy)
3 G2 g+ ], ?3 D! t9 Q        {
$ G3 Q  }/ o/ Q1 K) X* h8 p3 G/ ?# o% F                printf("a is %d\n", buf.a);1 n( @( x% y5 j
                printf("b is %d\n", buf.b);
7 U. V1 E( F: B- i* S/ k& \9 V/ c                printf("count is %d\n", buf.packet_cout);! w7 l* d) v* j: l2 e5 `& Y
                count_copy = buf.packet_cout;6 R: g; n# ^2 L0 k/ i7 N
        }
4 K; p& A/ N5 f; q' w& Q        else# i0 \- `* T9 W0 @2 z5 X/ d# Y  ?
        {8 j3 u+ C; U2 j: x& Q7 W; ^9 I
                printf("No effective message!");
! e/ J) q4 l4 l/ D5 V: {        }
1 L, r0 I/ c2 r- ~- l$ U" M2 T}5 y5 f  L6 B- I
/ g: ~* \8 o7 E5 A& X0 H
8 V- E( Q0 |2 N- o! O# _, K9 P
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。: V$ {0 k! h; B- l0 v' u) B" i
使用下面代码,对内存使用了mmap函数后:
# a$ I* w7 m6 M#include <stdio.h>6 ?! H3 K5 A* d: a8 [6 m
#include <unistd.h>
. Y* h6 O5 e% ^0 ^& T7 B#include <sys/mman.h>
% y1 w; Z' W. n, d$ W3 }#include <sys/types.h>; k5 K; [, z& C) C- a! p
#include <fcntl.h>2 |& A4 T+ B$ H5 m
# b! {) H" M% X1 t7 I
#define SHAER_RAM_BASE_ADDR    (0x80000000)  N. X; f+ u4 t4 l1 E. `7 U
#define SHAER_RAM_SIZE         (0x20000)   1 A7 u0 I7 h/ u! C8 U  N/ K8 ^; f

$ M9 n: V: g* \2 W" }typedef struct
/ E6 A! x+ E7 h9 l; a4 Y; Y* Z{
8 K3 J5 j5 t( P( c( o( X) }        unsigned int a;# h# @7 g- G0 \3 J* g( E  A1 ~/ I
        unsigned int b;
( S: d9 _& B, w) I4 {* @        unsigned int packet_cout;3 M! `, J: t) G+ f% b4 O% |
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ x. D/ A; T$ s7 d1 [+ f

1 c  E8 e$ T% K5 {, _  w* Z3 evoid read_MSG_buffer(int *baseaddr);& x2 a% p; m2 t8 k9 t6 W5 B
unsigned int count_copy = 0;: h  J. _$ w3 U: O
! L  [0 G" w- t0 F
int main()) l0 z! l( b) r. C+ q: L
{
$ a! ]- [" k- u        int fd;
. l( V* E1 ^: Y! M; q        int *mem = NULL;
% Z" N# g" d% N( M9 V
/ Y4 `6 }$ ^$ c9 o* Q        if((fd = open("/dev/mem", O_RDWR)) <0): h3 @3 B# M  e
        {0 v5 B/ Y. A2 Z; m6 w! ^4 O
                perror("open error");6 k5 v' L# }; d- b0 i
                return -1;5 T' }3 R9 w8 ]1 j
        }, G. Z1 n  {; O* N# F8 J, J
        - {+ \* g& y( \4 k
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( x/ I. P7 w( |# ?8 R  ?
2 ~8 g2 J' R# l        while(1)* Y0 R: M% P+ i' ^$ S
        {
1 F/ L1 m" N2 v6 P                read_MSG_buffer(mem);
0 V! L" h7 F9 I2 v/ F- }* O3 N; K2 a        }               
' M& u- V6 ?* n4 W2 r8 `: r3 N( ~}/ @6 `& o7 C: T. ^. K! Q
) u7 b2 H3 V/ F; p- R- R: a# u
void read_MSG_buffer(int *baseaddr), @! q% u: ]; N" E) t* ^
{
/ S9 R- B1 P4 l. N        pRX_MSG_PROTOCOL pshreRAM = NULL;/ u& e- j8 H' t; V

+ |  p) ?0 I- v* ]8 X        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
- n7 L, w' m, Z/ B1 I1 Z7 i& S/ y8 s9 O7 \% U& m0 P$ C
        if(pshreRAM->packet_cout != count_copy)
" k/ ]% @, b5 Z' e        {3 N) s; s- Z- z+ g+ C. c5 x
                printf("a is %d\n", pshreRAM->a);
- U7 L( e3 C# h: y7 T                printf("b is %d\n", pshreRAM->b);3 @8 O. ^5 Z8 N2 T/ V
                printf("count is %d\n", pshreRAM->packet_cout);( l0 _7 J2 m0 k; w
                count_copy = pshreRAM->packet_cout;5 ?; b  G1 ]0 s9 [0 N* }- M
        }
+ _5 q9 I, f! G( P2 o; {% S        else
+ P! j$ t$ a; }6 _% S) o        {" O. r: r5 H; e3 v6 m
                printf("No effective message!\n");
1 `2 r0 f: _5 G* |$ C4 S0 U! S        }
/ l- c/ Q: [" H- N+ }, c}6 @2 ~+ Z( T0 o4 R4 [5 a
2 r1 z& a6 {/ i8 a" @2 Z* R* F
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
( B5 z0 E8 Z, r+ |' ~, X3 }" d
1 a9 J' r. E; L$ |7 G- A/ n
& O( f. f! z+ h, K! F6 J
3 @# E) b8 y- L( ?5 I! w) I2 N6 b7 C/ R
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-2-4 17:41 , Processed in 0.041315 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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