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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 - \: D0 E6 ]/ b0 R
: o/ e+ B4 ~0 t4 L2 x8 P( C
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>4 d, l7 L, u6 v! v9 E
#include <unistd.h>  Y( z, n  m( }" Z
#include <sys/mman.h>$ o( n, a/ W, L. s4 Y1 i% A
#include <sys/types.h>
  V! }% ~' Y. T" t" |/ w% H0 x' y#include <fcntl.h>
) C/ H" E4 b0 u2 G8 E2 }* ^
: z. v! h- F) y: `2 c2 c/ h#define SHAER_RAM_BASE_ADDR    (0x80000000)   
4 v  C7 c5 W2 {& H( q% F7 a
" i! n- p7 ?* d4 J' d9 L! ?typedef struct
" u' Q& D, D: O{
7 K# s# r4 I$ b2 ^* h$ R; G        unsigned int a;
, x/ H9 C" r. z4 t  x3 j$ ^; C        unsigned int b;
9 R9 r& x$ O4 p: y        unsigned int packet_cout;
3 y) F% o/ D. R( u. a3 X  _( u8 ^}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 p' ^; n& V% g( J7 O
; j) w5 e: B2 [" d* s9 d
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);  }8 V3 O) L$ C# g" \5 Q+ w
unsigned int count_copy = 0;
* G3 j( i$ @* M8 y4 {  C9 O2 {( v4 a" d0 ^' g# M7 H

8 u9 H4 B9 Y1 L1 Rint main()
1 S/ x0 \0 k6 g7 m{6 N  n  U) p: O, v0 J, _
        pRX_MSG_PROTOCOL pshreRAM = NULL;
# H9 L  r8 G7 K! L! x        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 |5 B) W4 J2 Q- f* [
$ z) i6 y8 r+ O& b& z4 C; o        while(1)
$ [/ V% P5 H/ G! d        {
( V& R$ h: y' }3 {                read_MSG_buffer(pshreRAM);
% V) a6 @( V% N/ o) @        }                ; R+ g  U, P- E' K1 s# w, g% f* ~
}1 f+ h. f( ?9 y  p. A
: O: v2 c2 b% e, ~
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
% }: L7 P6 ?- r1 ?{6 ~% t( w$ `* h, G
        RX_MSG_PROTOCOL buf;
( H" u9 z! T: K- A& F; {0 V        
' F8 M- f2 S$ Z        buf.a = pshreRAM->a;
' c# X8 t6 E6 m9 e( Z* e' t        buf.b = pshreRAM->b;
% K$ v- P  W, K; b4 M1 ~$ t+ W3 ^/ v        buf.packet_cout = pshreRAM->packet_cout;
6 I% C' ?4 w% S% s9 f% G* w7 a( @2 @        ( U  ]5 t6 S/ Q2 V6 s
        if(buf.packet_cout != count_copy). s1 d/ v' `& ?, f" f# P
        {
) z. j) F3 N7 t3 g: c6 z                printf("a is %d\n", buf.a);2 _- H; o1 c$ y! n8 b  h
                printf("b is %d\n", buf.b);
0 \7 S! D% N- K5 V$ X* M3 k" F; b                printf("count is %d\n", buf.packet_cout);
7 k8 y# e8 [8 q- {( v( r                count_copy = buf.packet_cout;9 \, P- s! J8 E  O+ s
        }- {( v/ B7 y' k8 z
        else
) _, m7 e$ b0 v- C; t$ b        {
) d) [# V: N% L  g1 u2 a                printf("No effective message!");
, {5 o9 y, L( p        }& ?0 h$ d0 A6 r" M3 m: u+ s: k
}
8 N5 G; y/ d# m; m8 U  x" U7 D9 {2 ?) _& ]! Y6 K! O9 r
, V: t( f8 B! u& ^5 B
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。" n* w/ m1 D6 H( F7 w; o
使用下面代码,对内存使用了mmap函数后:
5 k6 `1 r  m, c, R" P! H#include <stdio.h>
9 C; D( p0 ~% [! t- f#include <unistd.h>- f' H% e: I* L9 |" k0 W
#include <sys/mman.h>
& w" R8 ?+ p# m#include <sys/types.h>% i. I9 U3 h* d3 h" q( F
#include <fcntl.h>
! ~5 D0 p4 n" l0 w: ?% ]& b: I: A2 D2 X2 d2 \
#define SHAER_RAM_BASE_ADDR    (0x80000000)& n- X7 ~# A+ i8 n" s( i# P
#define SHAER_RAM_SIZE         (0x20000)   : c: A6 ^' L( ]! P# |9 f+ b4 y

# T" z, W6 K. Dtypedef struct
6 j0 ]! G9 e+ b1 A{
( ~- v# ^& J' s! t* @        unsigned int a;$ m8 X! S4 S7 F& P) O! O9 I
        unsigned int b;
' E. p$ H5 v  }        unsigned int packet_cout;
$ i6 M9 `$ P4 s2 i. |  Z7 U* A" q8 K; {}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" Y& v1 y, m' Z7 D
& B3 R! K% S* U" k1 @  L+ Zvoid read_MSG_buffer(int *baseaddr);
/ C5 i1 i8 c# T3 H4 w/ Yunsigned int count_copy = 0;
) k% w& L% v% J6 D# P# f( c
/ I, I( m2 m( Q: y3 ]int main()# A- f8 i/ ]5 Z1 o; [& b
{
3 i# ?* p# c! L) p0 r        int fd;% z, O7 a2 w0 A- E- ~
        int *mem = NULL;
3 d7 K0 @6 g, {8 m- F# G8 k1 r) f% S% u. `
        if((fd = open("/dev/mem", O_RDWR)) <0)
$ L" P. r1 u* G  H        {$ `3 e) y* |$ K4 ^: F
                perror("open error");
$ h; Q+ `: X* y1 v% y  ^( z                return -1;
; s) V. f7 c/ J, w- R7 E7 j        }
2 S. r$ u( M9 \+ u( ~        $ J" z. A' D) q
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);! S+ _  i9 O- {* v+ q
1 l% h2 L7 d) {! n9 y
        while(1)
) t. r6 j1 c0 A, K        {
* m: y+ h1 ]5 u/ A                read_MSG_buffer(mem);
- X% ~% ]" y# E0 e$ i        }               
) N6 Y* w+ w+ p, {}
# I* a/ K4 Q9 O( C' x* Y- I% k
, [3 l3 u% k; ]! R. ]' Mvoid read_MSG_buffer(int *baseaddr)* A4 C4 H; B: l6 s& J
{# l) |- |; f. N. b. G
        pRX_MSG_PROTOCOL pshreRAM = NULL;
4 x! K: p: `! m" Y% O& j" P$ y- h' W: t+ A0 g/ g
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;( W* R5 G+ T; T
6 k$ |7 o, Q( m, b' `
        if(pshreRAM->packet_cout != count_copy)
5 Q/ r: ]% N0 d# C7 q, M        {4 _8 Q8 ~1 L" e% [, @
                printf("a is %d\n", pshreRAM->a);
* J1 v8 X2 c; Q* {' B; R. ~                printf("b is %d\n", pshreRAM->b);
2 i2 |2 v2 M: x0 F1 V9 Y                printf("count is %d\n", pshreRAM->packet_cout);; u3 e& z& l1 O% Q/ q9 P
                count_copy = pshreRAM->packet_cout;  x9 ~2 _" \+ C* M4 Z# }
        }
: t: H; W" e' w$ I, z& l  X" S) \        else
2 Q' m/ _4 Y! n        {3 D) L3 z& T; V
                printf("No effective message!\n");6 a# Q; Z/ s9 Z  G) @8 `2 t) Q
        }- v9 z8 m( s( |! l* d( y
}
" f3 h+ @- W/ C% x' ?; I$ Q' {$ q+ g$ [3 N  {
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 _$ s# ~5 d7 H& N( j) R( X; R: A, N
6 v  i4 x2 y$ f. F
" m3 K* F) Y; ?4 i& E

4 O* K$ K: X$ n2 c. g9 N: l3 V
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-19 02:17 , Processed in 0.039453 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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