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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑   b6 b6 X& A& t

/ ^8 g6 y+ G/ FOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
9 c* q4 o8 U8 m, n: h, q" }#include <unistd.h>
% Y, Y* D. T* G) M+ ?#include <sys/mman.h>
& v0 R# S% X1 x; v/ N8 _8 j+ @5 M4 O#include <sys/types.h>
4 ^  i) \5 K5 M* @6 n! }5 {/ P; Y0 W, o#include <fcntl.h>
' u* ~7 A; J7 @' z# w4 H+ D$ X; k6 W3 F" a" h3 Q0 M$ K8 K& r! U( v/ Z
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
' I: H$ Q8 A  y& b: d% A# L8 ^" L& v' x1 {  o5 N: b& G) i
typedef struct
& Z4 ?9 v: @7 [* \* m! q{
# M, v/ S) G3 g3 G        unsigned int a;
8 E  O& D/ V  P" ?        unsigned int b;/ q. m& Z; x: [0 p
        unsigned int packet_cout;; ^7 _% r" k3 L- ]  u( k
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- Z; }! T2 o" Q& X- ~* y5 m9 S5 e: r1 n  [( n
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
% I5 Z% P( J) Z+ m6 R$ P5 N% a. zunsigned int count_copy = 0;
1 D# |- ?) n" }9 L- P
1 Y! f" p6 }5 c- a3 M4 @, r. a  F& g2 a) _: F6 x# t1 _
int main()
  b& j+ V0 v4 r0 @- M2 m. A{1 O( x0 z' ]: J6 K" W
        pRX_MSG_PROTOCOL pshreRAM = NULL;$ \! |! f& g5 }, a+ `2 `+ C: w
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
3 D# D. |* H' p, @/ B" ^& h' l
0 Y$ b* r5 w& P0 L# d2 p" r        while(1)
9 _0 o& `: e4 n) ], z5 E- `5 z        {
& G4 o0 A" g  C- {                read_MSG_buffer(pshreRAM);" t4 s1 P1 ?! a- ^" v
        }               
3 l, M1 W7 E, z1 ?7 J( Q" \}: q0 }7 n% ?% X: P

$ u8 V! }6 W: n  q) i/ v" yvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)) D7 M8 s: V* F( Z0 @1 A' d
{
5 Q5 }3 y. A1 ]3 x        RX_MSG_PROTOCOL buf;
+ s2 r' U; E4 Z& O( j) {        % I. n1 A- x. F8 i2 M8 D
        buf.a = pshreRAM->a;% d! B8 q6 y% f; |! W  k6 _
        buf.b = pshreRAM->b;
4 D) m8 w% Y' @+ |" T) P2 W& u  e        buf.packet_cout = pshreRAM->packet_cout;" Y/ {; f, N' l- X+ ]& v+ }
        3 q3 D. ?" D/ S( T! k
        if(buf.packet_cout != count_copy)  n4 e+ P. b$ {( N4 V1 F
        {7 ~6 r- L5 w9 a0 |$ O" }
                printf("a is %d\n", buf.a);
7 \& f/ G  G( v$ S$ {" \5 t$ k/ Y                printf("b is %d\n", buf.b);
. n0 z* T- `2 E/ h; t                printf("count is %d\n", buf.packet_cout);
+ ]2 k" p4 e% ^% r% [2 ]                count_copy = buf.packet_cout;' `- v# f) Q5 L$ U2 B7 I* }
        }
  N. Y5 C" x6 T# _. T5 \        else
4 c0 F8 f. [/ m0 E/ \' v2 g        {: ~& j2 a4 ]" _3 R( a
                printf("No effective message!");
+ J8 t% B6 {5 Y; s  h4 {+ ~        }0 `+ U: _4 B7 |' Z$ Y4 c
}
0 b; v* r7 {+ f( O* t2 L* z: [( b+ }6 A4 R

7 }$ ]" O% G- ^$ K$ }但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
, v5 |- B* q, R5 h; G" Z( s/ C使用下面代码,对内存使用了mmap函数后:$ T' b1 K! z$ {9 p* d. G0 s- a
#include <stdio.h>- b# s9 E0 W$ v. K2 R% n$ P
#include <unistd.h>
6 S6 T1 _3 S8 i& C4 g3 w  L# P#include <sys/mman.h>- h2 h3 F  Q% H( x% m
#include <sys/types.h>
+ |; F. t; B4 C0 D' P2 B  e#include <fcntl.h>
) G0 J0 n. J! r. h! {0 ]- u4 k
* ?/ ?5 H% G: X# j# \  \#define SHAER_RAM_BASE_ADDR    (0x80000000)" Y, |3 _3 u/ y+ L
#define SHAER_RAM_SIZE         (0x20000)   
7 }: }5 V0 l" L0 Y
( B& z" K5 H" w, ~* E6 m1 b5 j7 Ytypedef struct
$ s  H! t* v0 H: V4 M{
' e! _% L/ r1 V, X5 q9 I( I& d! J; n        unsigned int a;
9 d8 i6 n; S4 k- B' C8 N        unsigned int b;
2 ?1 Q/ a* m8 N0 W6 b0 E        unsigned int packet_cout;
2 g$ h/ u, n* G7 A8 L! j3 H}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 m2 K0 D8 ?  ?% V; `
2 {; ~  @3 c) _4 H9 w
void read_MSG_buffer(int *baseaddr);7 [- @$ c- _& `
unsigned int count_copy = 0;0 o! f+ |; T6 t) r  K  O

1 B7 f% a8 ?. P; C' `: uint main()  ~) T7 Y: r9 D  d* Q
{
5 x4 H  l4 r4 y) d        int fd;
# l5 L! J; e1 U7 n7 y' K9 f        int *mem = NULL;: k+ |! u: I2 m4 @4 [

5 p/ W8 r3 }% O$ d1 Y' s2 C        if((fd = open("/dev/mem", O_RDWR)) <0)
9 k) X3 Z0 ]( O; `: E# A0 H, V) r2 G        {
4 w( b) W# v; g                perror("open error");
4 V6 `. u, u4 _3 ]% z                return -1;
4 \9 I3 z, n, m/ K. x! _        }! {: B0 t  y5 Y
        
$ _7 k. T, t' r3 ^3 v3 F. H# _        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 t1 T* n, M. s5 j2 ]3 D! ~6 A6 Z* i3 G/ p9 ~8 A  h
        while(1)
3 \; t( }$ X! y; ], g# H        {
8 [( n, ?& c$ n5 ]3 f3 S                read_MSG_buffer(mem);8 n/ A- T. u4 ~) S. r* U9 ]
        }               
0 f; T: h4 I: O6 D2 I}
6 {; w2 `( B  k3 F8 p5 {$ e- T! {) D  `
void read_MSG_buffer(int *baseaddr)) k$ g* k/ _1 H, n; w+ l$ W
{
& @0 W2 s' S2 `        pRX_MSG_PROTOCOL pshreRAM = NULL;
8 i8 {. c$ P2 \2 X
4 L4 e* }( B3 ~3 }        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;9 H; X8 l8 i" l9 o3 \6 i  G
4 L0 a  {; I8 |8 Z/ i/ y
        if(pshreRAM->packet_cout != count_copy)
- X( z: x* H) H0 F5 w9 a        {' |; C8 H. T) U& c) a/ e
                printf("a is %d\n", pshreRAM->a);
# e# E3 {1 ~$ {$ A5 o5 }+ J8 M                printf("b is %d\n", pshreRAM->b);
/ s" J" @' L% ]5 N4 t6 ~/ r1 L                printf("count is %d\n", pshreRAM->packet_cout);
' v3 d! ~; T$ }                count_copy = pshreRAM->packet_cout;
8 J6 m" x5 }+ p9 D6 Y        }
$ W( j" e6 D# P9 z" L* ~- F        else
1 x( d; c* d) K1 F8 C/ x        {
7 h8 g) c% ?7 {, W: C# X8 ]                printf("No effective message!\n");; d+ z8 Z( [  j) c1 I! ~
        }' c% O, q) ]2 B  ]
}
7 P) W7 p8 t: ~
; I8 f; J6 F; x, J) ^4 }& a# b没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
' ]3 V. ]! S1 B; H+ Q$ s- k
, m  y9 L8 ?& k2 p7 K; V# I3 x' O& i3 \3 [' x: a, o1 X3 m& e3 B
+ ~8 |8 v- m$ u/ L6 m' [
3 m4 j) X) q5 Q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-3 07:13 , Processed in 0.043612 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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