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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
8 F2 a# j1 o, x' _: ?4 u2 U. n+ u# e6 r3 |$ H" i
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 V4 \* j& v9 j, E' w+ y3 a2 z#include <unistd.h>7 B8 ?0 E: q7 _: k" c% ]" x
#include <sys/mman.h>
0 ]* D: _8 f* j. h$ x8 ^5 O. q#include <sys/types.h>
  T0 x' _+ j* I! U/ w#include <fcntl.h>1 b# P2 x" ?+ A

7 L# [4 K4 j- [0 K#define SHAER_RAM_BASE_ADDR    (0x80000000)   
* X  c9 T  K+ x' j/ o# U3 O" Z% {& j# N* m1 j: ?
typedef struct) @. P& I* I+ C* @
{1 Q! K" X2 |6 b% C
        unsigned int a;
* f- w. Z  s, V: U6 X        unsigned int b;
# N1 o7 T  G% z5 T: R        unsigned int packet_cout;4 p# z: h+ k- d8 U
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% D0 _, t& Q/ N+ o& |# S
9 A2 N( r0 S0 @" ^$ w9 Q1 v& r& `' C
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
8 \& Z' g: V" J" M; _& ?unsigned int count_copy = 0;2 D- a! W& x3 W

$ L5 H5 E5 w) G3 l5 s# d' T+ U& v9 v' L: n& A6 Q
int main()
, V+ u8 X9 C% ~/ j0 M: k$ N! L  i: d{
' M+ N  b. r. X+ Q; S7 X        pRX_MSG_PROTOCOL pshreRAM = NULL;) {& l5 n( i; n! {5 |/ [3 j/ `5 R. M
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;; b& s& O8 H- T- Y& k4 l
* H, ]; L0 {: h7 q3 x
        while(1), L* M6 P! d! V8 i! g
        {/ N, g( Y" U# t  p
                read_MSG_buffer(pshreRAM);
1 x+ ^+ `0 C$ k6 O        }               
/ G/ D$ U% f) g8 L% H$ c: c}
! s" T) e+ Y" ^0 `. F' n0 ~0 o- J/ X9 u; {- h- R
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
9 F' Q. f0 B+ m; z  t) \5 ~$ _{, }( O) Z) l7 O0 e! U2 _9 W
        RX_MSG_PROTOCOL buf;
. q; R0 P; _" d. g/ f# L' ]6 ?+ `$ k        
7 p9 h- N: ?% y3 P! K, @, X        buf.a = pshreRAM->a;. w! A6 R7 y4 g' n; s
        buf.b = pshreRAM->b;0 ~3 a/ `9 ?9 ~' F
        buf.packet_cout = pshreRAM->packet_cout;
7 J% ^1 j' U$ X8 d! ?# B% H7 n        
, Y1 `$ e; t- |8 D        if(buf.packet_cout != count_copy)
/ j. ]& ~8 r9 b) X: u0 g        {
# d' {( j$ x. `0 j- i                printf("a is %d\n", buf.a);
( Z. g6 X0 x% ^. |8 u                printf("b is %d\n", buf.b);
8 f4 ]/ {* a* G7 o% I) t; a: q3 f/ T8 E                printf("count is %d\n", buf.packet_cout);5 D# r4 \; |) ~% `4 H
                count_copy = buf.packet_cout;
& M4 c& ?5 a$ g        }
$ d  t! y) l% Y" i& @3 g4 ], W        else. Z3 ]* H- p1 z, v( H" l
        {
* o5 s) O1 o  v& i% U& [# j                printf("No effective message!");" {; M! z' P- x! a( c) r0 C2 G8 [0 a
        }+ w0 n8 {5 O- q; V# Q( j
}
: k3 g. H, |/ l  x/ b$ x/ ^( G
* A( R/ k7 c* N# H* L  f
! {' t+ I% R+ b3 E# ]' T但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
# z5 U! @5 m$ ?2 R9 ?( c2 u! L% }使用下面代码,对内存使用了mmap函数后:
9 Z; {% x' I* r* C  k7 t#include <stdio.h>3 X5 A& \* U/ S+ r- ?4 o1 Z
#include <unistd.h>
% _! W& M9 p" f#include <sys/mman.h>
, @3 a8 ~% p0 I* M+ y, I#include <sys/types.h>
5 j, {) J" M4 a#include <fcntl.h>
# d) c' V9 J, G1 a
/ t1 l- z1 f2 Q, A1 y6 x$ J( d2 d#define SHAER_RAM_BASE_ADDR    (0x80000000)
$ C7 g! X' T0 A9 Q" O#define SHAER_RAM_SIZE         (0x20000)   / v4 `7 E1 |  c9 z! \# p2 }! p
* G9 o8 @' S+ U, R* a" j3 R. G
typedef struct
4 s2 `. P" J  e{
8 i8 M; ?6 H0 N" P  N2 c8 X        unsigned int a;4 t" F/ g, S* i3 w
        unsigned int b;
  h1 E# |1 ?, D2 `/ G6 m- a. U2 j; W        unsigned int packet_cout;. w& }% V, l0 p/ D+ V* t+ Z  c* x7 ?
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& K/ u$ x' F6 T3 r7 ]! c7 \& l3 v

0 C) a. Q# W6 [- o# R9 n6 S& vvoid read_MSG_buffer(int *baseaddr);. O( E* p3 I( ?
unsigned int count_copy = 0;: r* w, m. Q# D/ b
, `  Y! I! C! D% \3 i
int main()* J. n/ l$ j4 I- |: O9 Z' B
{
2 Q3 L5 L. G: ^        int fd;
7 h8 D% {9 w5 `, Y8 R+ a        int *mem = NULL;
% f. |+ a5 n/ J9 W1 {
' l1 ~- C; u' f' k/ J/ ?        if((fd = open("/dev/mem", O_RDWR)) <0)( X, z5 {8 P4 ~6 M! @7 o0 P7 o
        {
1 a+ u7 t: d/ z& F* U                perror("open error");
. j: I2 k% z! i( l  b5 \! M                return -1;7 O0 E5 k' f. u
        }
5 d! x& T- T1 }: a- P+ |* R        
) b& \  U& \% Y$ e/ y' M- g        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);; l& w5 {( g' {# u

1 M! E2 F. ]1 `) j( k, I        while(1): C) ?1 m# d1 r) w+ I( }
        {
) x  f' z9 @, _$ i                read_MSG_buffer(mem);
8 a* ~/ X6 [# r  L, l        }                " E- {. c  k- G
}
) \0 E8 |- L/ N( d' A: P" ~; h; Z" U9 W- Y+ _
void read_MSG_buffer(int *baseaddr), P  q) t5 H+ {! W; M
{" l0 f" d" D/ e5 d1 I
        pRX_MSG_PROTOCOL pshreRAM = NULL;
2 H5 U3 A3 p3 m& I0 ?9 J0 i$ P* z; B$ C) K2 Z" X
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;7 N* |. D# Y. V8 M+ U+ @  {( r* K
, u8 |2 c6 o% l( R/ E
        if(pshreRAM->packet_cout != count_copy)
+ T; j/ ~" n$ c: j6 E        {
0 S. {' l  Z4 ?, K. f: }4 ~                printf("a is %d\n", pshreRAM->a);
5 v+ h* G1 E3 e0 ?( _3 ?. y                printf("b is %d\n", pshreRAM->b);  y# _2 Z& V; R6 j
                printf("count is %d\n", pshreRAM->packet_cout);
) r5 W2 j. J; d8 j. I                count_copy = pshreRAM->packet_cout;
) U+ j/ V. ?. F* ?% V' U. R        }
3 E5 K# S, h7 B; i6 G        else
4 N/ q( m1 N% `) ?# K* [1 [! ^        {
; J/ h2 K: H% p! L) K                printf("No effective message!\n");% `' W1 x/ W: Z5 A' c9 }
        }
. p, \/ q; s+ f- B8 _}( F3 F$ O- i) q0 ]# l! A' Z/ u
; w" P1 s4 l' B7 R3 u4 {* G0 G
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???/ p5 y$ d7 F! w4 I) J% ^- d

" E" X# G. Q( t4 @0 q
! e+ K9 I; u' [4 h
. R' b. O+ X1 k1 y: h( W3 G* M) i" ]0 v# \( o) ~6 e
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-14 19:06 , Processed in 0.041713 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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