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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 " K( Q  U* p+ m! Y; Y
  L8 y! E+ Z" `0 P( Z8 A% ^
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>+ \& b: Z8 D* z0 a6 ?* B2 e1 x
#include <unistd.h>
$ d2 o4 E2 ~9 A" f* p4 N6 I#include <sys/mman.h>
2 \2 y% ]& m4 g8 t6 U- k#include <sys/types.h>) `  {4 @  R, Z6 ~/ x& u1 {5 c+ C0 v$ b
#include <fcntl.h>
4 b* n$ j0 }( D2 q" [
) N9 z4 F* V3 z+ O#define SHAER_RAM_BASE_ADDR    (0x80000000)   
, a9 p, I1 }9 X7 V. s9 `+ S# q6 n7 q* P8 @# L( c1 o2 P
typedef struct
; w" B2 C+ t9 n3 N+ o{
; A4 [% y, d8 H' T        unsigned int a;! O( {* x9 U6 T+ T' g
        unsigned int b;: Z' n# ^) `" C5 {: Z1 j
        unsigned int packet_cout;; @! z6 G5 q0 R, B
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ a- @7 J" w& k# V. a- z; ^' c7 B$ G3 R! @" `
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
) w+ ?$ d# D4 a% u" e9 J9 lunsigned int count_copy = 0;
. u% c* q$ E* Y( Z% y
, H; }5 y0 x; \6 M9 t% k6 i9 {# Q! i( F7 c6 g* Y
int main()! k, P1 a- A8 I! v& g; L& c2 O
{
1 c2 d6 [8 n# P  ^( a* j0 M  V5 O        pRX_MSG_PROTOCOL pshreRAM = NULL;
+ [, ^6 V, Z, }. G8 C5 b        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 [8 V; c' K& \
; n9 p5 ?* }/ Y        while(1)
2 k; L) s# ?3 |0 _3 y" X        {
0 T/ o" o( P: h' J" Z, Q7 {# X                read_MSG_buffer(pshreRAM);. d8 @- W* q* o9 s1 |
        }                + z9 V5 W& w4 H  W3 T& {
}1 a2 i) v1 W- C' t

' p9 t$ U; F8 z6 V% Wvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)1 b8 S) Q+ `. k( D9 [; m. e
{
( k' q: a" X$ Y2 F) [        RX_MSG_PROTOCOL buf;
7 R0 ?2 C3 Q7 o7 Z% K' b) A7 _" {" U$ s        + K+ T  z; U" b# I6 l
        buf.a = pshreRAM->a;; N% n) y! Z) G' B! \3 f
        buf.b = pshreRAM->b;! x* W8 ^( q, D) a4 e0 R, J' @
        buf.packet_cout = pshreRAM->packet_cout;
8 o, f0 I$ X5 l+ Q9 A) Y. g! X        3 i$ i9 T4 Y! V0 H, O
        if(buf.packet_cout != count_copy)+ n& i; n/ f: Q: v/ c8 M  g) @$ B* b
        {0 }, ?1 U! k' \- R7 h8 O9 ?
                printf("a is %d\n", buf.a);5 F* g5 g) ?4 c
                printf("b is %d\n", buf.b);/ s! Y+ ]2 r- v) A
                printf("count is %d\n", buf.packet_cout);! e( p- F' }4 K+ M" K% _/ ]9 {
                count_copy = buf.packet_cout;
6 S5 E3 O7 w" [: q        }
! w# {7 }1 L4 ^        else
& }7 f( C" x9 p& ]! L. x        {
! |4 M  m" L) d( z  R$ ^6 r. P1 a                printf("No effective message!");
7 t5 H9 ?/ `! n        }
& {" u1 ^/ \/ \% M& {}+ M5 K9 v- _% \( @9 A. T
1 G% Y* v4 u, a* O( N- Z, L

: t$ q" K2 u9 t& ^1 ?但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
5 X9 {" L3 _  w% g使用下面代码,对内存使用了mmap函数后:
. G) M8 D4 k* P% j#include <stdio.h>
1 K! D% [; o8 S# {  B% ~7 B#include <unistd.h>5 W# D9 R8 q& N2 Z$ S  A
#include <sys/mman.h>0 ^& [  N3 P1 q8 G% N
#include <sys/types.h>" X' V" C2 [) l  N" ]1 H
#include <fcntl.h>. v: z, w- g) C, ?
( `& Q) Q( f' S* u3 g3 R+ f
#define SHAER_RAM_BASE_ADDR    (0x80000000)
( u6 W9 i0 Z6 B#define SHAER_RAM_SIZE         (0x20000)   
3 e% ~2 k1 q% Q0 P$ v' q) T+ E5 t- t  u/ T( _& U. r
typedef struct9 V3 j; |; S' S, l  s' n
{
+ T( Z* }5 K- h        unsigned int a;
; W  `2 j& M/ @! z# o        unsigned int b;& @1 q4 B  g: ^: B1 B0 Y  l% s6 r# h' {
        unsigned int packet_cout;! Q5 ~3 m  H! g& ?' A
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. N' W/ `! ^' w& s: J& ~
+ k% B7 r' y* f" ?void read_MSG_buffer(int *baseaddr);
3 E: ^2 Z% [" `6 h6 [unsigned int count_copy = 0;1 H/ {+ G+ a4 n# x; ?4 W3 p
% R4 K" K/ B, [& N, d
int main()
8 y% N  [3 h# k: `; H+ F{
5 O* y* ~6 M+ G7 _9 t        int fd;0 ^- ^. |' f( \3 V0 H! W$ B; D, n% e
        int *mem = NULL;- m0 z) O3 ?) h7 Y

! R8 I2 Q# B1 R4 a        if((fd = open("/dev/mem", O_RDWR)) <0)
) H8 G3 j  k& w, I; W: ^        {3 p3 g+ H, N! S4 q
                perror("open error");
4 _2 A# u) Y; b7 x7 P- p4 a" `. m                return -1;
6 X$ Q+ S2 w# Z, X; k        }; T4 w# c: R  D
        
: s6 N  w, Q5 F- ^0 i5 a        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
# x! R: G0 Q0 t1 t4 r3 i" E' H
* E0 P5 u( M1 e: Z  o$ |9 B$ u        while(1)( S% U9 a# B# f- u2 J% R
        {
6 a4 C  h! A. B                read_MSG_buffer(mem);: P; A6 [$ y  G4 l. x, }- l6 b; Q: ^8 d
        }                9 M6 L" o+ h8 Y& p  L8 o3 o: Q
}
2 q. |# Y* a7 e6 }* b: Z" u
1 l1 V+ W3 @% s- Uvoid read_MSG_buffer(int *baseaddr)
7 S$ q* \9 H; ^& L{
- ~1 |. p; n: p; p" A        pRX_MSG_PROTOCOL pshreRAM = NULL;
0 ?. u5 A# ]) f' j  I* ~# g3 A0 }8 w  x$ t% W
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;8 V" [  k. M& f8 H: u) |; X' O
& x! v. e- s+ v
        if(pshreRAM->packet_cout != count_copy)
. A, T6 M9 x* m        {  e; M* f) r/ m2 N8 h; C5 Y
                printf("a is %d\n", pshreRAM->a);4 g' y7 W5 a  d" V
                printf("b is %d\n", pshreRAM->b);& T1 D5 i* Q  d6 O/ P% N1 ~" y
                printf("count is %d\n", pshreRAM->packet_cout);( q; o/ }1 @; h8 k& L( n: U
                count_copy = pshreRAM->packet_cout;  ^: P$ r+ H8 P: V3 N
        }
- c% J/ R" p  T2 Z, t5 N        else
0 Y- T4 s2 [" V7 x' }        {$ _# Y9 O1 `# t$ H6 C- L* M
                printf("No effective message!\n");3 g9 t2 b' X5 d$ d$ F! k
        }8 g* W! C0 T% C  M  k
}% d2 v, T" b& ?7 X; ]
# l; U* N) c9 ^/ ?3 X9 I
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???/ J7 Z8 i/ z5 E1 C
, }1 i) P1 P# p! _5 u0 w
& M# K1 ~0 v1 l. E0 [# _% K

# w6 [' l$ r. w# @" B+ u2 v3 k4 ]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-1 13:17 , Processed in 0.037985 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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