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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ' ?" s& h$ h5 j% u

' h# |3 V  l0 q, kOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
, W  e' {5 t( y9 A! s#include <unistd.h>
" s0 v$ R4 I5 P- c. ]. N#include <sys/mman.h>
/ c, B  {1 F$ P! x+ K& b- w. W#include <sys/types.h>
  W$ H3 ?- v# e& w) w! ^#include <fcntl.h>' O6 N) c8 Z$ G+ B$ Z, |, q- i
8 _# Z' i7 o. F3 Y
#define SHAER_RAM_BASE_ADDR    (0x80000000)   % Q6 p8 u: \, z# K. E. o2 _* ?
6 W0 b  [- p: m$ ?7 m
typedef struct
* \& z& a$ E. N/ \$ Q4 k{: z+ Z  j' E7 e" G  ^/ }
        unsigned int a;
, F4 q4 \! p; ]) k* \, t        unsigned int b;
) g# S& L1 R7 I( i( T6 m        unsigned int packet_cout;7 V+ R5 l7 P" F9 t. a3 z7 J
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 A, ^' b; c3 Z; R

3 M5 o7 L1 j6 p0 ?6 {) o: J7 `% Ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);' X6 `, y$ S( n* q) d8 p
unsigned int count_copy = 0;
" V* s0 ^& M9 _2 K8 \7 ?- D3 y# P' `$ m( {; S: l; d4 S6 h+ o; C3 S

. x3 h2 u$ K: i- M' \6 wint main()8 R. t( R  w: P8 x/ R
{/ P" g! A* {; y% a5 I* ]
        pRX_MSG_PROTOCOL pshreRAM = NULL;
, A) q- J7 E7 O6 }        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;7 k9 a1 w9 W" K3 F3 r/ _; |

1 s! X8 e: _. @' S7 q! i( Q        while(1)- x/ a9 P1 A" q. ~2 Q' J; P
        {0 ^2 z8 `8 M4 q! I6 W, X
                read_MSG_buffer(pshreRAM);6 t+ \6 _& J2 [; a* W0 p0 I
        }                , j- Q; i) l& R7 r6 d/ B
}
% z' W/ \" @# t
" ]- o8 ]& F) fvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
' s" k* {( [* u4 F1 r" ~% B7 \) J8 j{
; m! D( K7 z, q        RX_MSG_PROTOCOL buf;* e' N0 M8 p+ H& |
        
& i; B9 `+ _% O) l5 H9 C        buf.a = pshreRAM->a;
7 i. s0 n  |- ~/ Q7 Z. w        buf.b = pshreRAM->b;
% Q# Y2 B1 }, e, z        buf.packet_cout = pshreRAM->packet_cout;
1 m/ ]' i" e/ s          L, I& G+ S5 s# J
        if(buf.packet_cout != count_copy)% {: w- {9 z3 D! `: j
        {
4 X& a$ M) Z, O9 W8 R; n) ~                printf("a is %d\n", buf.a);3 x* X: X' m( L& j2 C$ \
                printf("b is %d\n", buf.b);( }* |0 Q6 L# X2 @, N
                printf("count is %d\n", buf.packet_cout);
9 v; x3 @: i0 X) y' h( u' [" \6 e                count_copy = buf.packet_cout;
( R* R- p' z: l4 L" T2 \: m8 p, d9 F        }
! G( o! D: F( K& F3 R  W) @        else
3 h& a, `# m. H* q        {
0 C1 @- w: S9 ^& V# e% j" S                printf("No effective message!");+ ?% D6 J8 [! ?; k0 r
        }
$ A" U# w5 I/ U. Y" Z5 N2 N, _}% v& k2 N3 E. d: |
& u5 r( W1 p- z# h  s; V3 K

5 R3 C! L4 Y+ S5 h% x! W但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。9 w1 j  I: }& A& z% }, F
使用下面代码,对内存使用了mmap函数后:
+ d( L5 H" v( I% v2 A2 x#include <stdio.h>2 h9 q/ j! G: k& w* x# z
#include <unistd.h>
' g8 b3 \, }2 z5 j. S#include <sys/mman.h>1 X" D% l6 S. q9 K& f
#include <sys/types.h>
2 ~7 a4 R4 ~3 I; k% h$ v#include <fcntl.h>1 W( \7 A4 `& B1 k
( H1 h7 r$ }, o0 [( E+ K
#define SHAER_RAM_BASE_ADDR    (0x80000000)/ L! b" L# B# ^7 k' v3 |3 O( h7 N
#define SHAER_RAM_SIZE         (0x20000)   ; C$ }. s1 j8 o# y: M

! m( ~) y* y- Q# Ztypedef struct$ v- l. B, g( W8 ]& F& a* x5 M
{  N. w5 W: h: E
        unsigned int a;7 @: B9 g* S3 f5 b
        unsigned int b;
& w- _; Q. _1 T, w  P& k( z        unsigned int packet_cout;7 K1 r0 `+ W$ N. l7 I) s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! e& h5 R+ m! t* U8 `
9 z. i0 h; A2 t2 B1 zvoid read_MSG_buffer(int *baseaddr);/ k& Y& j- {3 \9 x
unsigned int count_copy = 0;) M$ y% Q  u# C( f2 K* G
4 g  q8 ~6 p5 O( k4 P. B) K
int main()
7 R. o( c- \4 ], S- M{
0 z; i" P8 j# Z) H2 [; }& _        int fd;0 n1 ^  c, y" o& Y! |
        int *mem = NULL;
( V+ ?3 O) T: |8 F6 m& H0 G4 x# L& g+ B+ t. {% P: p
        if((fd = open("/dev/mem", O_RDWR)) <0)
& q2 s+ `9 K7 Z$ a5 v; T( w        {
" }: M4 r! K5 i6 Z- e' j( ^$ @8 e                perror("open error");6 o- {, F6 {) U! K
                return -1;$ @( M6 ~- f% k. a" k% ^) O8 i
        }6 `6 m( @% g/ G( E$ V4 i5 W2 O
        * R& F  B5 r9 ~+ L7 a& t: |
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);; q, e4 p0 j& c/ ~- C. o. b, X

0 Y! ?0 Q' w& b, c; g5 J% A8 B        while(1)0 @4 x( B4 \5 T
        {
  O+ x0 @8 s& W( y5 R; t( f                read_MSG_buffer(mem);
) @( l" C4 ^, B, ?3 g& m- t" j        }               
2 a' L4 H7 k6 T! `* |}  B8 I- f* J8 ?: _7 m

; N5 M7 F6 B* x: e% Lvoid read_MSG_buffer(int *baseaddr)
$ O* b) A9 r2 c8 ?3 E{
  \' Z3 `' b: U1 I  A1 C3 E        pRX_MSG_PROTOCOL pshreRAM = NULL;
; j* I# p- D. n: O# U" b' [
* H4 p  |. ^1 P1 K2 x! q3 @        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;* q% M2 o2 G; a: p( P

, }: t0 ?: Y7 U! r        if(pshreRAM->packet_cout != count_copy)
8 |. @9 }+ T: {& @- p1 \        {4 j* t/ i. K: V& R( N
                printf("a is %d\n", pshreRAM->a);
; O% ?! l  _2 H! U0 x                printf("b is %d\n", pshreRAM->b);
0 ?" Z6 q2 I+ O4 G9 K                printf("count is %d\n", pshreRAM->packet_cout);9 ?: |  w: \! r. |& q0 `/ i7 Q$ u
                count_copy = pshreRAM->packet_cout;% l7 P* ?: `% o7 L' K
        }9 L  |0 f7 @* w3 ~' d  J3 q
        else3 }; S3 N8 f+ \
        {7 `4 z; h! n3 \) x5 x* y5 L
                printf("No effective message!\n");2 x" w: s  P6 O4 b5 y# M0 h$ Q
        }
% r* @. w' b5 [5 i" X# W}* _3 C! G) X2 ~- h3 h( P
2 v3 S4 N3 B0 C. e- Y: r* k
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???( j$ N) u2 a5 c9 J6 E% Y7 E
/ f0 k3 k+ i7 l

' A4 L+ v0 L5 m) i/ j4 o* G2 w0 T4 s' c" O( u

  r/ S/ T" p& i2 \( M
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-25 07:05 , Processed in 0.040767 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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