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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 6 N+ q0 i4 I+ q# T$ A( c
- {5 G- l3 h! _( r, K
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
' d$ W; e1 \) c0 a  b! [: d#include <unistd.h>4 [# {, o% {0 v0 V8 T
#include <sys/mman.h>+ _3 x# S) }+ c& l( V
#include <sys/types.h>
1 D: z. Y( O; Q9 ?' F& i* W#include <fcntl.h>% ?* T2 r# O2 b* @7 ~

" J! c; \' `. q* I* b" I8 l#define SHAER_RAM_BASE_ADDR    (0x80000000)   1 a0 x7 F% R- |, B7 g

; p$ T2 u+ M+ u: Otypedef struct3 p0 w; g8 t* R5 o
{
, a! d6 u! z( Y" A, n        unsigned int a;
! n- _' @" _+ o& ?/ u        unsigned int b;0 V; V5 z2 Y: `7 N; k
        unsigned int packet_cout;5 Z* C/ a# \" i* Z; g1 `& t. s$ X
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) W/ y4 F4 B9 }5 N. V4 w9 w5 a% t
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);- G4 ^) Q/ z# |  x. y" Q" R# h: x
unsigned int count_copy = 0;
4 a) R8 I/ N0 p$ r' W! u
% C0 A. I6 I' B1 X/ Q8 u3 p
) \5 w  l5 ]4 F0 f( U, ?2 K. Kint main()
: ~3 j& `$ C& M2 o{$ x5 l0 E+ E8 g4 _
        pRX_MSG_PROTOCOL pshreRAM = NULL;, w" t7 M6 ?) f! u5 a
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
. Q0 {  U  C. D( a; P6 w# S" P* ~+ l
        while(1)* _" t! k" g6 a  ?  V% Z; V6 g& Z
        {' ^2 `* V* J. n
                read_MSG_buffer(pshreRAM);. r1 b5 U0 X4 {
        }               
% ]9 F8 @+ n. ^2 z& G* @}
3 O1 \2 S/ Y5 [  V2 c; o9 Y8 R* K: m* I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)' ~7 t. p: j( ]: H5 m' U
{: e* v  M0 \/ t- W
        RX_MSG_PROTOCOL buf;
* _! e0 w1 M% B$ K" f4 J        
+ f& E$ u. Q" w" F        buf.a = pshreRAM->a;& @8 {& w4 K0 N6 N5 ], L
        buf.b = pshreRAM->b;. @$ p. ?  i/ w
        buf.packet_cout = pshreRAM->packet_cout;
: s; Q. t6 K" _, }* p        ; Q+ D- P' v' p) }% i2 y5 F. @
        if(buf.packet_cout != count_copy)
3 H$ r& ~& a" h: a3 k) T        {
( S: u' s0 x; l  ~' ^                printf("a is %d\n", buf.a);
, N" P' |7 n2 _; b                printf("b is %d\n", buf.b);
- F( e/ M* \  n) x* H2 ^! _2 y                printf("count is %d\n", buf.packet_cout);
# a3 d  I" A( C0 q6 C3 ?; U                count_copy = buf.packet_cout;
4 l6 ^' X$ d  j8 c, |- k        }8 C2 u9 T( l, W, M
        else- k+ n- S6 Q3 T& n0 t" U; a
        {# |- w* X2 J# A% l# g
                printf("No effective message!");
& h5 Q1 r; Y/ J& o2 Z! B5 T4 f        }
' H' j9 C4 J& M& J}- H- n6 I5 X8 g' @3 C5 ^

! c2 O: L; e5 m8 O% ^- i5 p: k/ i/ s# k. N
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
7 Z8 v: P7 a+ x, Q, `; C2 W使用下面代码,对内存使用了mmap函数后:5 e. G. A0 W# P) Z5 i
#include <stdio.h>5 l$ X8 `& Z4 ?: P; Q% j0 q( D5 m) c
#include <unistd.h>0 j5 ?- L0 {3 \" w. d/ I
#include <sys/mman.h>
. U% f9 x; s" `" X- _) P+ s#include <sys/types.h>8 a2 ?2 G7 }: r' P# H* G; C. n# A4 S+ d
#include <fcntl.h>
6 R5 y8 V- ^! r
9 `# S) }5 y1 G" A1 w6 w2 g#define SHAER_RAM_BASE_ADDR    (0x80000000)
& J+ e. h5 t0 E+ X$ w#define SHAER_RAM_SIZE         (0x20000)   
- d/ w- k- ]9 `* n/ I
/ c" R, i9 m" ~$ etypedef struct( m$ P: W! r! k, a
{
! A$ d8 r. ?9 x        unsigned int a;
" x0 Y. O3 h5 a' l+ a. l        unsigned int b;
7 \, K) h* ~' v* F2 e9 G& K        unsigned int packet_cout;% p3 c/ t# q% J9 X: o% L+ Y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 n- N+ o, f9 ]

/ S' S8 E; Y( M1 Svoid read_MSG_buffer(int *baseaddr);
( q9 y4 A6 w- i1 Z6 _unsigned int count_copy = 0;
! E1 q: {; t" p7 Q% `' p% m. p; X% `- ^- \6 i7 B6 q# k
int main()
5 T! `8 P. n. J8 y, r; Z{
+ D. f+ B: z0 D& f        int fd;! V  ?' A  V9 D& [; K# g
        int *mem = NULL;
) c# X5 z8 e" \0 `( e3 ?' j0 ?" f' e- p4 X3 t) z
        if((fd = open("/dev/mem", O_RDWR)) <0)# ~) X# S# X# x9 x. S' ?
        {
# D5 Q# i" y+ L' L: l, w                perror("open error");
* s1 W# z) v1 b% q7 r                return -1;1 F5 y! ]7 d7 G" |% v  s
        }
8 D" |2 J# b& x( ~" u. h        ; I" b; t! S/ v; m1 l* U
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& j/ ~6 }4 o- r3 f4 {! H7 `2 U+ l
        while(1)+ H0 t/ N. L& \) G# F  ?% e
        {
0 o1 O/ k3 u4 n' |$ h8 Y2 c+ g                read_MSG_buffer(mem);
$ l, w& @: e- A$ G        }               
7 a# r4 z" C- X4 {9 f  D- i  y- q( a}2 [9 s9 W: X, C& I2 v( Y; I

$ |: T% b7 ], Svoid read_MSG_buffer(int *baseaddr)
( f! F( C& N3 S% p  ^1 ?{0 Y9 d+ o& b" P! h
        pRX_MSG_PROTOCOL pshreRAM = NULL;- l, H2 h# y7 s+ H! w& j$ v

( r7 X: B' `$ l4 W* _* w        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
: X* X3 b/ O( R& G6 O+ T: _* B3 f9 b/ G- H8 j
        if(pshreRAM->packet_cout != count_copy)2 t8 g% g/ p# t* q4 @; ~
        {
! R) x. P- V6 a* K- n, Q                printf("a is %d\n", pshreRAM->a);+ h. d& `( H0 m# ^0 y  i" g8 h
                printf("b is %d\n", pshreRAM->b);
. B# h7 C5 M' d: S# o2 s3 K. u                printf("count is %d\n", pshreRAM->packet_cout);8 N- G8 D. H( @! E5 _. i! a
                count_copy = pshreRAM->packet_cout;
( k6 `+ L/ K! b" m        }
1 ?" X9 p# ^3 B7 J        else: Z2 T1 x: _0 u8 E% T& {
        {
: t2 N: j, ]/ |                printf("No effective message!\n");( M# i' z  O6 A+ L
        }. Y) Z0 |" ^6 X2 ?: I/ ~
}9 R2 M- e* e) E% R. y2 B& _

# B% t4 u  |9 {没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???4 l' l! a6 |% p
: G, |; u' E& H; M% {

3 g" M5 X% c8 s& M# J+ Q9 L$ C9 O0 ]/ D. _2 Z# s9 I+ b

/ D, Y. ^) W- e/ O8 p
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-26 11:40 , Processed in 0.042597 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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