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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 3 p2 R9 |& V6 x4 Y1 L- v

& L  f( p, E: H: W' W+ JOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
' U% Z$ ^' O# c#include <unistd.h>
) b# _! T5 M0 J& }' }1 R#include <sys/mman.h>
' s% e. Z2 E% o; z% n7 b#include <sys/types.h>7 {% p2 ?+ s6 Z- H* ^
#include <fcntl.h>
5 c, C) q7 l3 C) Z% J- F. A& V8 c: W
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
9 L3 I& a& Z$ O# O2 G) Z' i+ ]
1 I+ u- b- ^" T: d: q! P: Ttypedef struct
  \6 k. _: j: `9 C  Q/ Q{
/ a) ^$ A! G* J; d- z        unsigned int a;) C) V' n, F' _2 R
        unsigned int b;( |: o3 `# R# b1 _" S; |1 E8 m
        unsigned int packet_cout;
8 C! \1 P7 Y% P1 N4 X6 q9 F- v}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& E/ |: n! E1 D: {
- y6 W6 a% u4 L' Y. j& uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
2 @& P' V# O5 X% T- c- yunsigned int count_copy = 0;; F: ~( @9 u4 ^/ W; E5 N/ k7 h5 l
3 w$ A! d9 j3 Q; M
1 N# |( B6 j" i% H0 J) s
int main()
3 B) p( ^) n9 B% B+ g$ c/ N& `{- F! H& h3 A0 S* X& v; @
        pRX_MSG_PROTOCOL pshreRAM = NULL;
; Y8 e) Q' R, t! i: z& u+ |        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;8 D3 a; \) i; U. \: H& W
! Y* ]" l1 y* P% {$ c. X% i
        while(1)
" N& F) t8 H( W  o7 R% q2 E: O        {$ u' R9 z$ `  J" y
                read_MSG_buffer(pshreRAM);
8 N  y' c- }8 A1 }( ]        }               
/ @9 \6 y) {% j( M: c& j}
9 u1 h1 Y  ]- k& [! Y' j6 \; P/ B; q( k* s: b4 p; |
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)* v; P7 z1 D" H) c
{* S" ]7 d; [# O
        RX_MSG_PROTOCOL buf;9 r  `- q) b& p: k6 q
        : f! O! q) t  f, V1 j% S
        buf.a = pshreRAM->a;
) a! z7 K- L) P) N' z: W' I        buf.b = pshreRAM->b;
" E  c$ X) w) M) y) m* \        buf.packet_cout = pshreRAM->packet_cout;
" k2 ]. u8 f  d  ]( g# w: l        
0 O$ T1 B# V0 j9 _' J        if(buf.packet_cout != count_copy)
: d" X' k% U4 G3 `        {- v8 ~& |2 x, v* J
                printf("a is %d\n", buf.a);( N0 S. Z& t' S' f4 R. }7 D# C8 `
                printf("b is %d\n", buf.b);1 ]# g/ k* Q; _, f- G
                printf("count is %d\n", buf.packet_cout);2 ]: @- ?9 M& N! p+ {* A5 ^
                count_copy = buf.packet_cout;
5 E3 R; V, n! \9 v+ ^        }
6 l" _9 f+ w* g, v        else
0 ^& f; N4 {. g3 ?% M( J        {" K' w2 h' K7 p
                printf("No effective message!");
5 Z2 x9 [  `2 l. b. M6 K9 J        }
9 @, C0 i8 y2 @) r( V. ]/ B}7 v: v; I' T& T. D8 m

% u1 S. z5 m7 c  D0 ^' s2 l1 c
/ k5 \. _# Q0 A4 k4 `) ^# i但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
. B+ n4 R7 ^8 S3 o( i使用下面代码,对内存使用了mmap函数后:2 m  C8 B# ]$ v) G# [  L8 i- T
#include <stdio.h>7 g! c2 i, U4 U2 R
#include <unistd.h>! H8 H* F  E) S8 P  f( d
#include <sys/mman.h>, g( f) O  f3 ?  b' B$ L; Z$ b
#include <sys/types.h>
9 U% M+ m( r. F, s5 E+ z  _. ?$ ]7 v#include <fcntl.h>  a3 U( u; P: n
( X, ~/ q/ I3 P- O2 a- J% m$ g
#define SHAER_RAM_BASE_ADDR    (0x80000000)
! |! f7 P% P% B- x3 ]#define SHAER_RAM_SIZE         (0x20000)   5 `9 o) r( g) ^9 q. E) f& s
; F. n: e( x- g1 z8 b
typedef struct
, `0 G$ \) Q: R& l( V5 Q! j8 g{
2 J: X2 w% ?0 m$ Z9 U: I        unsigned int a;
6 R$ n! p* g* |. J        unsigned int b;- S3 J- z7 S8 w: q! p% o* |
        unsigned int packet_cout;: {. C/ O) W# I7 k2 u
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# j) e8 G! N! y8 B$ P

6 w6 V9 W/ J" Pvoid read_MSG_buffer(int *baseaddr);) M9 N9 `% R' N/ }* u) X( t+ U
unsigned int count_copy = 0;9 @- p' F( m9 z  [9 T0 u# i

) u; p, ^7 R; v8 u2 |int main()# w* g) E9 r( s
{8 ^4 C. g. \9 @- Q: f( I' Y
        int fd;
1 K8 h+ V8 n  {4 M; t' N1 J        int *mem = NULL;
' H$ b" K5 |; c. _. n2 k' m. I  y% D0 @7 J* e
        if((fd = open("/dev/mem", O_RDWR)) <0)
. J  b1 b- z! |) |% t        {8 I+ x" ]0 h5 B" \& B: d( k1 h
                perror("open error");. ~/ P5 ]& J4 v! }: k( w5 Q; f8 |
                return -1;4 d3 S) r. Z% ^6 o# J+ J. d/ H
        }1 \+ S* ?2 O1 r7 `2 L: {' F
        
$ l8 ^/ k0 F+ `  j* k        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 i3 c% Y8 \* a6 u  ]1 V) ^4 j5 R0 Y9 E
        while(1)
, K3 z7 T5 f- G1 L        {7 S  J% `1 z# B. W
                read_MSG_buffer(mem);8 ?& w5 {8 E+ R% T- T  o
        }                . S, H$ p* W7 G  ]
}
$ k1 l( a; a9 C. e1 P1 W7 V' P0 E/ u6 l( _4 ?
void read_MSG_buffer(int *baseaddr)
3 E& {, P: O  h+ k  q0 Y( F{
. `! W" x! c' J& O( w        pRX_MSG_PROTOCOL pshreRAM = NULL;! j, i4 v6 l1 I! k- h9 c

2 }1 X9 u6 {0 P  b$ r        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;# Q$ V" _0 L/ x0 T/ k
, F) v! V4 I5 g
        if(pshreRAM->packet_cout != count_copy)! q& y! l3 S& N3 _4 x% R' ]% s
        {" c/ l, u4 b3 @1 e1 R
                printf("a is %d\n", pshreRAM->a);
1 J2 U9 [, r3 J- I/ W                printf("b is %d\n", pshreRAM->b);. [! V1 h- A$ ~
                printf("count is %d\n", pshreRAM->packet_cout);% Y9 e7 }1 q4 V
                count_copy = pshreRAM->packet_cout;
& @( T* h2 V5 c) s. e8 o# q        }
! X+ w) ]9 q! s' L  B        else
9 t! u0 }3 s: s: J  m2 o        {
5 l- G2 y  J) S0 k. P                printf("No effective message!\n");1 Y9 M# z' R7 ^5 P9 K% q6 @
        }. l4 l3 S( b7 V% P7 J
}: Z' Y7 K0 r" B1 s& M2 s

" Y1 g( v. j* y2 u) o没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% y3 V$ c0 X* m- v' ]$ P0 I/ J& e  f, E5 a+ l( ~

; t1 n+ @5 [9 g6 X0 Q) u: a. |+ H& s
8 O/ d! B' y" \9 |
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-28 01:32 , Processed in 0.039166 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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