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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
5 \6 |% X1 r$ ^; z
- A. @$ ^4 n: \& hOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
/ T7 I9 {4 ?/ U, ^, r: Y8 A#include <unistd.h>' W5 e% d5 z& U* f. ?: w/ N" B8 t
#include <sys/mman.h>
: z. I  q( l3 _7 K- v9 E; o#include <sys/types.h>1 M' P: y' g5 n
#include <fcntl.h>3 i5 C" ]: H, M3 t  B* f. W

7 u' G, _" ~5 E0 j#define SHAER_RAM_BASE_ADDR    (0x80000000)   ! o8 P' u% o7 W, ^, j9 B

1 t. v) |% I' Ntypedef struct
. b8 o+ S) M: m4 i" j{
" f& b5 K% G  f        unsigned int a;, C9 i  E% Y' V+ z6 J" Z
        unsigned int b;
# X$ @2 z% `: V* {5 P        unsigned int packet_cout;1 \- _, J3 B& E' ~
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- ~: r* \$ o% H! }" [( J8 i# b4 F% @' u! e6 y: j
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
, \, I) }  C" \- i1 ~/ w3 punsigned int count_copy = 0;
& J$ i$ I$ b! n) |8 O
4 L. E6 n7 n& T  P1 ^- o: e) q' ^3 ?! `: b# K6 h$ d
int main()
- K. E) i  _9 X! C. O8 S{9 I. H6 J& r* ~* Q9 `
        pRX_MSG_PROTOCOL pshreRAM = NULL;  L0 s+ G2 Q; @: Q: G
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;* W# S! i* d% W9 H/ q) S5 e" R' k

6 g$ _# @7 h2 c; _        while(1)1 o9 A$ S% m; E1 b% ]: y8 p
        {( V. T# X3 y0 e- e6 {. b
                read_MSG_buffer(pshreRAM);' \7 t" G9 V; Y. J# _: W0 w1 C  t' J0 C
        }                2 U3 |- U$ c4 x: G) @
}
3 Q! W, _  D2 r3 c" X: s# R5 O  a* B1 F% \& i3 w$ ^) N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 q3 W$ g- B) C3 g7 k{5 e* d( z: ?+ q; X0 V. L& y7 J
        RX_MSG_PROTOCOL buf;
/ R& D+ Z1 h$ `        ) q! _0 }# K/ n# H! @5 W
        buf.a = pshreRAM->a;9 o9 I9 p* n8 T; Q! r* O3 D
        buf.b = pshreRAM->b;0 S# A1 g4 d0 j
        buf.packet_cout = pshreRAM->packet_cout;4 f8 u& S: O$ V, K8 y2 Z3 x0 J
        
, h, [: `- A; T4 m        if(buf.packet_cout != count_copy). p/ ]! ~; L. ]+ b5 i' P- e
        {" D' _/ K2 ^0 f3 c3 T
                printf("a is %d\n", buf.a);1 U4 O0 e8 H' G* s7 r
                printf("b is %d\n", buf.b);! x# J2 F3 P) c$ F4 b/ b
                printf("count is %d\n", buf.packet_cout);
* {# ]. G/ z! ~# H: K                count_copy = buf.packet_cout;
2 M/ _" g7 ^7 M1 [        }
* W" y( k( R3 c4 h: ]* [) v7 ]        else( e5 n$ l- u. S6 @4 Q  l
        {* l0 W3 L1 r3 V. y  N+ Q
                printf("No effective message!");: X* y* W' r% X# g% i& s
        }5 i" `% M, b1 c4 {( }, x: l4 Q
}/ ]. S/ l9 m! g
$ \) F$ i+ |3 N! V5 ^# |% f

: ?$ e# X' i2 u但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。  G6 V, ^0 a9 t/ F0 L
使用下面代码,对内存使用了mmap函数后:1 C8 _/ |8 j' j( q4 ?0 i1 X
#include <stdio.h># ^- E% c, @) g% r+ |! Z
#include <unistd.h>. M' {& m0 B! g/ J" G3 ]
#include <sys/mman.h>5 ^2 ~, H0 n) s0 ^: |  w! t+ ~
#include <sys/types.h>
$ \, L; a' J+ C( E$ q8 c% b+ n#include <fcntl.h>
3 X2 I/ x6 b, _" m
1 B3 y7 G# B, g7 v) L#define SHAER_RAM_BASE_ADDR    (0x80000000)  E+ s( W) B7 l
#define SHAER_RAM_SIZE         (0x20000)   ! |$ t$ _* n8 M- E2 N0 K; r% F

1 [' K8 C/ _6 _; x9 etypedef struct
/ Y0 F4 o1 ?( L% x{, ^  v. s5 Q: }. g' }* @
        unsigned int a;
0 e) w% k/ ?0 U. s3 v' ~        unsigned int b;
- V1 ~1 }+ Q2 x4 ^" N- v        unsigned int packet_cout;
, U; ]2 |# ^) J* }" h' }}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; l3 R& |6 y+ T; ^) V

- z; s6 a5 H! v8 B% ovoid read_MSG_buffer(int *baseaddr);7 n* t! S1 S7 z) }  i
unsigned int count_copy = 0;
* p" ]  r0 J& q6 X! v+ Q; t1 W! M6 I4 G6 n
int main()  d4 h' s7 t7 q  {7 G1 t( O
{
# L# M- B% A8 p' Y1 h; r5 N        int fd;
% u4 V& @, u& s3 v/ w        int *mem = NULL;) I& ~* C2 x& d2 U; b# H

) _9 _0 s& J0 K; ]$ B1 k        if((fd = open("/dev/mem", O_RDWR)) <0)
1 F; a* D4 V& I        {9 |  X8 z/ A( `7 N2 l
                perror("open error");
+ F! i) w/ ?0 T                return -1;" b9 O9 w* g3 C& y+ P9 S0 X1 O9 V8 L
        }
* X& F/ a/ I( V* N3 {4 T, ^  U        : m* J6 h; P* G" O' P! ]
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);: z6 z8 c9 Y" B+ I
0 Z4 l$ J. ]# ^! k" `
        while(1)
8 l  X' J* e/ [5 n6 n- T( a        {
  |( d- F- x' [# f                read_MSG_buffer(mem);
% [3 D& M. l2 U, O* |% x        }               
+ ~( l' J& K+ ^8 M, S}: v# D! x  s6 I* D  U0 f

# t8 @; m  |" L: k, M3 Lvoid read_MSG_buffer(int *baseaddr)$ p( O" f( U4 j4 d, W
{; b" |6 ~3 k0 w* R* R! {( `
        pRX_MSG_PROTOCOL pshreRAM = NULL;
. Z  U5 Z  Y; t& h' Z* I" `; K# e: p; t7 k  ?# N5 E
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;+ S5 j) R+ P( r4 H5 G

; H0 ^/ F6 \( T        if(pshreRAM->packet_cout != count_copy)
+ T5 h- n: P0 C  b  j; {: w        {1 d- F& n1 a/ A8 Q4 r% V
                printf("a is %d\n", pshreRAM->a);
8 S* l1 ~" n2 L) a+ {6 L$ A                printf("b is %d\n", pshreRAM->b);5 C, p( H$ k2 |9 E* r; h
                printf("count is %d\n", pshreRAM->packet_cout);2 U# H( u0 U, H
                count_copy = pshreRAM->packet_cout;; b+ N0 `. ?) P, D
        }" C# B8 Q% K; v6 Y1 d! J
        else
6 N$ [4 r' S3 x8 l        {5 X, ^0 @8 l- b/ _- B$ X
                printf("No effective message!\n");* t7 M$ z0 j' k
        }6 H% P3 O- p. i$ u4 u. i- @; ?
}
! O. A. J* r1 X9 W# ~/ _
& u# ~9 T4 w  g1 y1 W没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
+ W; ^5 H: n1 F* b- U
3 L8 e  b# w4 W7 T5 a% f4 C0 |* x2 ^
* b" m; F5 h  Y  T
9 k: q& _9 f* q6 @$ M3 h
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-3 06:13 , Processed in 0.044139 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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