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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
. s8 ]1 D2 D: V
% E6 l0 P5 H. Z; _# Z9 H& `OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
3 |1 Q) o$ h* H#include <unistd.h>
% E: X( L3 J7 y7 o#include <sys/mman.h>1 q( ?0 H+ `  g
#include <sys/types.h>
& _% y3 d8 U4 b0 z- T#include <fcntl.h>2 ~2 b2 z7 f+ `/ c7 E

9 s  o! J: N6 `/ y; F0 J, z#define SHAER_RAM_BASE_ADDR    (0x80000000)   , \! O! Y8 y/ T) C+ D. [1 }

0 m! U* b. i; u/ r; f: ^typedef struct; G1 M0 i! s3 o
{
) C  b+ M6 d+ J$ Z$ N        unsigned int a;
& G- z: X; g3 m+ p# G        unsigned int b;- p; Q9 M' Y8 f' Q0 R- \  ~
        unsigned int packet_cout;
8 L& N- b3 [; f+ x}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* \" h! `; R  ~/ B# W( U
( |& C9 b% J# R1 v7 V; F2 H, Pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
9 a' k! e0 X4 j0 Junsigned int count_copy = 0;
9 h3 w! U) w  A" a4 W: }& {8 T0 [
8 T$ I3 E$ N6 ?: z2 }# I0 u" }  f% L
int main(); e4 o/ n9 Z7 o8 I6 U
{3 G) _2 @% o% V2 c1 Q
        pRX_MSG_PROTOCOL pshreRAM = NULL;/ k1 }' I( i3 b2 `, K. P/ U
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;/ |5 |3 O6 l$ {' e
+ `8 ]0 A6 q4 R1 o& z, N' @
        while(1)
0 ]; R* I3 X6 Z) ?6 Y* B        {
1 R  A# M# ?5 L- w                read_MSG_buffer(pshreRAM);
/ q- s0 }4 p7 h/ L% W# U8 M/ t        }               
% y' j$ e1 E$ n3 I}
4 j, R- B* B0 N% G! `: h4 m& R; s1 d: P% H$ l2 T* V
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
* ^( |/ M( h5 n  U0 G{! a' e) r, S8 A  f
        RX_MSG_PROTOCOL buf;
5 I* b+ z! C& P- n. C        
; ~  H% X+ B% r# U        buf.a = pshreRAM->a;' s, Q* o$ O+ U
        buf.b = pshreRAM->b;1 W* B# l# U% P  |0 ^' C2 w
        buf.packet_cout = pshreRAM->packet_cout;& b, v5 g; E$ a* _, g2 E* ^8 ~
        
0 Q" T5 n, r5 Q- V( U/ W# W3 t8 R        if(buf.packet_cout != count_copy)( M1 h( Q, K1 T; h# f
        {
, z9 ~# _* l2 E- x# D- h                printf("a is %d\n", buf.a);' j- ~/ ]/ `5 d* }: v
                printf("b is %d\n", buf.b);
0 P4 G# C8 o  r6 T/ c1 q# P                printf("count is %d\n", buf.packet_cout);& p) f- T+ G" B* s9 l4 z% O
                count_copy = buf.packet_cout;
1 w. i, |. }3 C1 _7 v$ ]        }. h4 ^+ _" z+ s# I) E  t6 e
        else
8 T* i! \, j* O8 v9 t        {3 x6 i) \! S7 w' s
                printf("No effective message!");+ g, i7 v  v2 t, [0 m, T
        }( Y) W. o& v* B: i/ X2 [# n- ?
}
  t& k$ z  `2 T  _3 F( ]3 x' c, z: o7 ?* O7 U( i% O

& k- A9 x+ @+ x! x  O但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
# c$ P$ f: \. y) b% l$ b使用下面代码,对内存使用了mmap函数后:& k) y- Z- O1 \8 k: A
#include <stdio.h>6 [# }; ~4 J: I1 q9 j8 G- q
#include <unistd.h>
& h" ?6 k  R! d#include <sys/mman.h>
, M) c8 A$ \0 U3 N#include <sys/types.h>: \* U1 Y. f# J7 n/ o) M8 n* m
#include <fcntl.h>5 T+ Z" [4 p$ }4 p9 |

4 t; j5 l8 i  u3 K  x+ }% X#define SHAER_RAM_BASE_ADDR    (0x80000000)
% l( Y' {0 ?2 F8 Q; J1 u#define SHAER_RAM_SIZE         (0x20000)   
! N1 t1 b/ c( [0 A3 P
# Q7 Q( F) o1 H" d: x0 Htypedef struct2 f3 T' R; Z" O. b1 c/ L! k  r* L
{
: J+ m) K3 I  R3 Z0 Y( p        unsigned int a;$ ^+ b1 @- t) W! A  Z5 V
        unsigned int b;9 i" i# |" M& }2 V8 p
        unsigned int packet_cout;
' ^2 v( L# X" J9 p: ?/ H}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, B/ {- V/ v' L6 e6 t2 U5 P

+ P# Y# r3 F7 [% {1 |* q# Tvoid read_MSG_buffer(int *baseaddr);
' `2 U4 A, |9 E" M# Uunsigned int count_copy = 0;
4 ~5 B8 d- ]0 t( S. l4 L4 \" @" s( v* b8 t* `# c
int main()- I4 A5 M4 b& }7 J
{
& b* w+ U/ X# C. I% O4 R        int fd;+ k* ?' W: Y8 n3 a" v. o
        int *mem = NULL;( B0 w: u9 T5 T. C* r% s$ c- w

' ?9 J; a! x# T! y8 K# x9 |$ y" Q; K, A        if((fd = open("/dev/mem", O_RDWR)) <0)
, @/ ?+ ?/ U- {        {7 V5 `& E" v$ D$ m" ?' O0 f( F2 p
                perror("open error");
- ~& b0 A7 ?6 G                return -1;
7 R1 X3 P1 Q& g2 W) f1 s        }
6 H2 w! e  R1 M3 J& \. i3 ^7 t        
/ N& Q0 A5 H# i0 U8 {0 s& l        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);5 n+ {1 l8 D/ }3 W
* d5 I% Z& X' A. v
        while(1)
7 ]' T( t- w4 B        {# g7 N: k0 x" K% L0 ?2 {; x' `
                read_MSG_buffer(mem);: F7 W/ N2 J& E2 c
        }               
* ~7 L6 \8 o! x- t4 W* d' X}8 N+ L. G1 A* f1 j: S$ k( {8 G

+ `. S1 Q, M! V6 ?; {5 Fvoid read_MSG_buffer(int *baseaddr)
) Y) R7 Y1 h7 d' i8 o$ W4 r' u{
9 ?1 s) V& B6 Y$ n) Z/ a        pRX_MSG_PROTOCOL pshreRAM = NULL;
4 M8 |/ B3 j+ p" l4 w0 A
: q3 I. A/ I  L, S# [# ~' b5 O) M! E        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;/ s& {+ n$ o  J; j/ T' m3 T

( M" H. |3 Q# a        if(pshreRAM->packet_cout != count_copy)
+ x- P& T6 q7 j        {
7 q* L6 f5 ]. m                printf("a is %d\n", pshreRAM->a);
$ u7 M& [8 Q4 R; u& d$ H                printf("b is %d\n", pshreRAM->b);+ s1 }+ e6 ~. v6 w( R) |! I( v, ]6 \
                printf("count is %d\n", pshreRAM->packet_cout);
/ C% {9 h& P# b  H* J; `                count_copy = pshreRAM->packet_cout;
" K* Q- D  n9 n' ]        }' l6 b( |7 [7 d1 F  `
        else
: @) M8 \7 I6 r/ O        {
/ D, m  F3 t  r) U                printf("No effective message!\n");& C$ E; D4 K0 _4 x
        }
8 `0 _( D) ]) l( s, M; Y- s, _}
! v' B6 [1 w/ n0 `6 t3 w
- p2 s/ s) F. @0 H, X没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 q! f# I8 j1 {9 d* J# W& ]% Q# a) l# }* S0 b4 }6 K# D9 Z
7 Q- P* Z* K, l( U& s

& h' M4 I; e3 ^2 X
) Q& D" r/ c7 G3 H7 H7 x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-15 08:58 , Processed in 0.058192 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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