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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 & U. P8 u. {) `

5 v7 D9 O+ [3 t6 `# }$ |2 ?OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
7 M& _; M& f3 h( z  h1 z& `#include <unistd.h>
5 s- K- D" w) X! o4 ]8 m#include <sys/mman.h>- F+ l. c7 K2 X- X2 t# B. U
#include <sys/types.h>+ j/ ~8 j* C! L; S1 w
#include <fcntl.h>6 D! }: H# t2 c3 B
* Q, k$ @7 f1 z! |6 a% T  I
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
, ]# H7 h6 K2 o
. g4 G& C4 N0 R6 C4 Ctypedef struct
1 e8 R# T7 H3 T3 o/ |{! b7 f0 }" G6 l7 t8 z. t
        unsigned int a;
4 e5 f, f& i, j$ _# g5 @+ i        unsigned int b;5 E! G; t" Y+ g, w/ r7 G( s2 S
        unsigned int packet_cout;# A5 o' P$ u) c7 A9 N
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 c4 E4 c' C* Y$ \/ w1 \; J7 z. ]. Y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
3 f9 M+ s0 }) N1 d, iunsigned int count_copy = 0;
  d7 ]( w! r1 s" E% I. o' k+ E9 Z: Q7 U1 P8 D

" Z/ }9 g0 B( J) Xint main()0 x# r( f" f) F3 n5 d  d8 B' o+ y
{
2 y8 T! A% x. n+ p4 Y, N: L        pRX_MSG_PROTOCOL pshreRAM = NULL;
& [/ E5 ]# f7 g7 @8 B+ x5 D4 ]        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
4 I0 C" Q6 C3 l2 L/ P3 `, Y; j8 Y, m5 D% k; h
        while(1)
  y+ L0 d6 [! }( |( i" X        {
' r$ S$ X7 q! P& M- x9 J) q1 j+ t! C                read_MSG_buffer(pshreRAM);. B6 s5 `& R0 P: K8 E& P& T
        }                9 x) l2 O3 t% _$ x6 r! ]  ~6 q0 O
}
" M$ k+ Q4 K' E2 C" a. R7 s/ ~! d/ k+ r+ t; U' z! H
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
  U& r0 Z9 `' \' w6 |{' a9 H/ X" W2 E) o  x# R! |+ T
        RX_MSG_PROTOCOL buf;
+ b" ~; X# N  ?2 ~; {        
. P- w/ A; r/ t4 J, x6 E$ K& u        buf.a = pshreRAM->a;
2 X8 N! P+ d4 h2 C: K3 A. Z, k        buf.b = pshreRAM->b;0 l  r$ i8 C# r$ M
        buf.packet_cout = pshreRAM->packet_cout;' Z' i; s7 k' y
        8 Q+ Z% m9 f9 i7 C  {4 a
        if(buf.packet_cout != count_copy)+ G3 Q% A2 u) S, S
        {
* `8 P/ X7 e$ ^! H1 i                printf("a is %d\n", buf.a);
2 f( d5 S* T* x, Z: X9 [. }6 f                printf("b is %d\n", buf.b);
" b  {, o& P$ |9 w  F! r" k                printf("count is %d\n", buf.packet_cout);
) q4 Z( ^0 e/ d( m$ E& h                count_copy = buf.packet_cout;
" t: G  O1 D/ C/ B        }9 b9 P! \1 l. V& f* T) J+ ^$ I
        else+ X* O5 x1 R5 u8 V! O
        {
3 p& Z' B0 h- Z8 x                printf("No effective message!");
2 D( d0 N5 n$ d        }: R3 |9 m# ?* O
}
) w! X* W# W9 z+ o3 d! u  |/ l/ y) ]% C$ Z" S3 w8 |

7 I, y" a& E3 k) |: O但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
( n' H% V1 J2 ^- t使用下面代码,对内存使用了mmap函数后:
' |6 R% W/ ?" z#include <stdio.h>0 n# \' b6 y* X7 R
#include <unistd.h>! Z5 k) l: M& w
#include <sys/mman.h>
. J/ ^9 i; B  Y2 M) K3 N#include <sys/types.h>8 l+ \/ Q: b3 \; p3 f6 P; p
#include <fcntl.h>
$ E6 t& {4 o' J  D3 ?2 n$ j! x( q0 E  d) [7 g7 u3 ~) l& [/ _) [
#define SHAER_RAM_BASE_ADDR    (0x80000000)% c8 o5 s2 x* e- @  w
#define SHAER_RAM_SIZE         (0x20000)   6 K7 `' o: U8 ~, S
2 U. I$ Q7 ^5 C/ y! l3 D  V" f
typedef struct" H- }, A# [+ u
{
% @& h1 ~( M3 b: A4 _6 v        unsigned int a;
  z& @" H( e0 E5 J0 `        unsigned int b;
) h! B& }5 f/ V        unsigned int packet_cout;
+ j0 z+ q9 [- }7 W! b/ D" p}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* F+ z; F* j9 Z( |& |

8 W* s* k3 X6 Q) }- @  o# {void read_MSG_buffer(int *baseaddr);
0 t8 f) x6 C2 q& H# V' k3 O8 _' Dunsigned int count_copy = 0;. ]; W: o1 i4 v% F

, Z6 s6 n0 {% Q7 D( M2 t9 D5 oint main()* a; Y+ Q; }  c* ~. w" W7 \
{
. W0 p  }6 l/ s% w2 z( X        int fd;* o7 x+ K: n/ j3 Z6 m7 g1 |
        int *mem = NULL;  o# h9 E! b  t, F
$ u  B7 ]( }) Q" G8 I+ y( l
        if((fd = open("/dev/mem", O_RDWR)) <0)0 G7 l8 r! K5 K; `* R; p  _! l
        {
. m9 l) j2 Z) U! q0 f9 B) D                perror("open error");: M) z9 E, J8 P0 p/ p
                return -1;- b, W: {6 o+ r4 K8 N- M4 u
        }
$ x4 }/ L5 H/ \$ p: {' B        
! M7 T" T, \' y7 B7 ~        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( ^2 \1 e* ]2 N  x8 C: h/ S; B
8 i6 y0 y$ c) G3 P+ \3 U# I        while(1)
: A# S0 q' z0 b* o        {
+ Q0 F1 T! `$ k( u4 F8 y  z                read_MSG_buffer(mem);1 f5 ^8 i7 a5 \' `" i
        }                9 w) y0 n! `" u
}- |, r6 l8 f/ C3 j: W( G

: d1 _: j* c1 O0 P& }void read_MSG_buffer(int *baseaddr)
  L& T4 t6 y- T4 }" E: q, ]5 ^# }{9 F* z' v, a3 W8 w' M; ?$ S
        pRX_MSG_PROTOCOL pshreRAM = NULL;1 e$ v- A5 f! r4 m2 ]- U8 {  u

: A' x1 D  D& P4 y7 C* n* p        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 A; l' O2 \1 S# z2 L8 `. Q9 C5 v8 w- w  m
        if(pshreRAM->packet_cout != count_copy)1 g0 g2 S: I- ?( a" [
        {
* ]$ p6 x  z) ~8 I+ T1 d. a                printf("a is %d\n", pshreRAM->a);
1 T2 t% s9 I; |4 i) A6 f! w                printf("b is %d\n", pshreRAM->b);/ c4 l3 ?9 `, m
                printf("count is %d\n", pshreRAM->packet_cout);
4 z" t6 O* b( l* _0 w* ^                count_copy = pshreRAM->packet_cout;
8 b! `6 m2 y1 T( A, b, B4 A        }
, P+ j/ ?5 Z, x3 l+ N* ?        else
9 C4 ]9 w* ^* g% \% T6 ]: {  @* K5 j        {
( b/ G4 [! p# |0 l  T- Y2 I                printf("No effective message!\n");
( v, i- S( h/ s$ U$ y" S2 U* _        }
8 ~8 [' k( A$ J. h/ C! S! x; g- {1 ]}5 [, Y2 q1 s+ U

4 f0 N( h2 R5 V$ x6 q/ l没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???. e6 f* k9 I! G" |) {

& w) w, W) ]& _! q, H3 M9 A: k: R3 T( a( v9 I

$ S  Q, M4 ]. {1 C6 ?( p3 ]. i( q3 I
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-2 20:25 , Processed in 0.039311 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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