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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
7 w7 j+ Z6 q+ }3 o. w, P8 Y2 _" V% {6 @  |' B
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>; ~. g' W# i0 l! ~
#include <unistd.h>
0 K- I( X7 ?: {5 K#include <sys/mman.h>( ]) G/ e% ~% _8 Q2 f0 N8 p& c
#include <sys/types.h>
8 T: s! O: s, z9 G6 ^#include <fcntl.h>
6 Z& c! g! L. J
/ n- |, D5 \6 E* x4 w#define SHAER_RAM_BASE_ADDR    (0x80000000)   / |1 W; {$ z  ]/ L/ ^! f

: }6 s. A( `9 U; C2 Otypedef struct: ]( j; k& Y+ b
{
$ a: {/ n# s: m0 e3 l# U        unsigned int a;; Z' c& R" ?0 t8 k; y+ S5 o
        unsigned int b;" I( L5 m0 f4 u3 @8 x& N) f5 i0 [
        unsigned int packet_cout;8 N2 E; R! `, Y( K& }% n
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) \) Q0 o5 j$ z6 B7 F+ y! e3 f: C7 q
# k* x/ G% F) ?% M# S; s5 v
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. U) u% K, M8 v5 e7 ^3 Cunsigned int count_copy = 0;2 O" h; @/ H9 h2 X0 ~8 g2 K5 Y4 D
+ o6 M$ `" z% a, m

7 I0 t4 u3 M! E3 wint main()3 x# ~! ?" Z, ]! [: W* _
{6 W. R; S' P9 Y. D6 K2 r
        pRX_MSG_PROTOCOL pshreRAM = NULL;8 K% N* U" U% Z6 |2 K0 I
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* m$ I) ~5 l/ n1 M: {6 ]9 @6 Q0 b2 A. q/ _
        while(1); e" @9 q0 N; B" C8 V9 A
        {; a. y6 }1 N' P, B& c% @( A
                read_MSG_buffer(pshreRAM);
0 q* P; x0 x, o; S5 @% e. w' C7 [! R        }                + K3 {' d  Q( Y: n/ r0 c
}
. d% a" t$ ~1 D; R% c! t5 }$ v; K/ a2 o4 S6 X9 X/ u
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- ^# m, t) ?6 n+ T$ H( ]{8 I; s5 u' o* }" K
        RX_MSG_PROTOCOL buf;
* k% l  ?" Y" w1 L. _        
7 @! U& r# B! _6 x  }( P# h3 C: j        buf.a = pshreRAM->a;
2 X! m; r2 ]6 s. {6 d9 i6 J        buf.b = pshreRAM->b;
! p' ^3 w2 ~* _6 e& J        buf.packet_cout = pshreRAM->packet_cout;: j1 X& l  Q1 _  n7 J
        
& M) }& ^, d) r$ W% T        if(buf.packet_cout != count_copy): a* ~/ a( x. E- \$ f. t
        {( i- b; x( e5 t* A7 k1 R7 m
                printf("a is %d\n", buf.a);
* X  k. ~: A  {/ v                printf("b is %d\n", buf.b);
' f+ {; y9 X; l* G( S3 ^9 x                printf("count is %d\n", buf.packet_cout);; \  M$ z+ \0 |- q& e0 p
                count_copy = buf.packet_cout;: [0 e) i" k7 a
        }
/ `+ L7 [5 n% S% O( M        else8 p  F+ A1 D/ |7 \- u
        {2 R. |6 o* \! V6 s/ X
                printf("No effective message!");  R& U6 N0 @4 o( u& d4 U& L2 S
        }/ e# h. D  r3 u. R* h
}
% f% ^$ a) j0 k; U( P: J* w) I/ Z& F9 Q' D. T9 L% k3 `

8 E$ }4 ^$ T. \但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。0 x4 y( \, T- X; h3 o
使用下面代码,对内存使用了mmap函数后:
* \! Y6 Z8 n# e# B3 n) d#include <stdio.h>
# m/ ?: J% \0 f#include <unistd.h>
9 G  P+ R0 ]7 ]1 e9 Y8 c#include <sys/mman.h>
% o% X; S" p4 N4 `2 L* {% l0 }9 N#include <sys/types.h>
8 v' H* t' Y5 \. _) ^9 p, L#include <fcntl.h>
$ o; [# @! Y# l+ e" I( T6 n' \  _# t8 ^, J+ A. ]
#define SHAER_RAM_BASE_ADDR    (0x80000000)
6 n7 \9 ]9 ?- W#define SHAER_RAM_SIZE         (0x20000)   & e  g( V: v% |& @

( R2 c" M' S* O' v" Ktypedef struct5 O- a' m3 K) I" ]. o  N& _
{( ^/ D& D; }: W/ v
        unsigned int a;
- }. x' f/ a3 Q- Y, c2 `: Z9 G        unsigned int b;/ C: ~+ C, R+ I5 D
        unsigned int packet_cout;
; |4 K% R$ v% u8 e}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 v2 A# W+ `# u* n9 K( ^* ~1 R: F8 C+ ~6 ]
void read_MSG_buffer(int *baseaddr);
- d% w4 S/ `& f$ Z- G; g4 Runsigned int count_copy = 0;
; H8 _/ i8 `6 l" m5 t8 d( b% ]( S) S1 _4 m
int main()0 n* c$ e' ]5 _. n: x3 y& X0 n* z
{9 g9 x  A- ?& g
        int fd;
" C9 \/ |! Y; C. U2 S+ [' S        int *mem = NULL;2 O. k6 N- J* j* w) ?# J% ^
! d' M( e1 U8 A: K9 w# C8 D
        if((fd = open("/dev/mem", O_RDWR)) <0)3 E6 M. O8 D% ]) S, f8 C
        {
5 R6 U4 \( u& s' W; w                perror("open error");% G5 n. M' c, h, L' v4 Y' d4 b
                return -1;7 N7 s$ [! \7 l2 k2 R
        }% @' }2 O: N; @- l  G% ]
        
* t" |/ p' N- O6 Y        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);! c. o1 m0 H" J0 I: D
4 v" s: Q8 _/ i7 N* l
        while(1)0 G, ~2 r/ |$ `- Q
        {. s: x$ U4 u' r' U. r. P3 A
                read_MSG_buffer(mem);
. e1 s! H4 \5 o1 t1 H        }               
4 _0 n% \& r+ T5 E# o. G}
0 d1 z, e# K& f4 A( F( P7 E; ]2 o! ~' M- M
void read_MSG_buffer(int *baseaddr)
+ |9 n7 {2 F! o% D8 R1 j{
3 L3 c/ I, y# B5 D- s" {        pRX_MSG_PROTOCOL pshreRAM = NULL;
8 _+ M5 `/ R7 A( e7 S- b
& m) p2 _* C) N4 u8 j6 d        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
6 ?8 O1 J7 c+ ~5 N' ~% T- l1 ~1 ~, c3 ?' [" b. Y/ Z8 s
        if(pshreRAM->packet_cout != count_copy)
9 `& u6 l2 u! v0 M! i        {
. ?4 h4 V! w' D                printf("a is %d\n", pshreRAM->a);
( P; _0 r+ q# Q; h                printf("b is %d\n", pshreRAM->b);
( B) O% n5 E# x4 V                printf("count is %d\n", pshreRAM->packet_cout);
. B4 h, |! d+ X                count_copy = pshreRAM->packet_cout;
( B4 M( c! z: C+ _$ p+ E' V        }: T' b# F9 A  x" A1 E
        else
7 m: x* @, ]2 s! j: o. t+ g# c        {
2 H- @6 D& t" _* `                printf("No effective message!\n");
3 V+ Z& \0 U5 ]0 a$ i) U0 j, Y        }
1 |. m0 q2 n0 R# e) h}
7 k) @$ a1 \+ {. v  r
2 C5 k! _- d" c没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
. ^. g' R: G! i8 P0 a! Q' k
' s, p4 Z. x' k. m1 t- [2 I" }. N$ ^' w+ ?% q

) k+ u: [* Z, p) V! F
; L% R% @6 N( o
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-2 23:02 , Processed in 0.045816 second(s), 29 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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