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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 Y/ C0 `$ B" y" j5 D- @0 v& q4 c) i. d2 }# F
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
$ W, W2 [5 H0 y2 J#include <unistd.h>9 k& J7 A4 |4 Y4 Y" y
#include <sys/mman.h>
6 @2 I2 u. [- \9 T3 |#include <sys/types.h>
3 U: N& V2 G! C- x#include <fcntl.h>
) ?3 m" m  [/ Q- U4 a6 s& F  l. N1 i' r" r6 x- N1 `* A* R6 w
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
. X4 \8 ~6 r% V9 y5 l3 d, Y1 _% D; Z. \/ I! L1 G1 @& h5 c
typedef struct
0 m! _0 Z6 u, f! a& z{
" l5 I/ q. U3 I1 s  M% A        unsigned int a;
8 k5 k( F! h# M0 u/ B6 n        unsigned int b;
- i6 @0 ]2 a( Y        unsigned int packet_cout;
$ X; p% b( ?- ?5 f9 \}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ T* o5 @- \; P* g! p2 ?3 n0 {
0 F9 A2 c+ w6 jvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
+ u  ~7 z# }! [" nunsigned int count_copy = 0;6 r) Q! I0 v0 ]2 E4 Y2 M

  m4 L) y& {8 V. N2 |) ^
* T; R+ x- i2 p, e* O7 ^int main()
8 \. n9 M' \. i/ f- V{
4 R: Q4 u: e& F- [8 N" k        pRX_MSG_PROTOCOL pshreRAM = NULL;" M9 q$ B  A: u; h' d
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
3 B/ D5 D+ V  ^6 _$ d( W& S
$ I: N- S2 I6 L; \+ ^1 V, I7 `3 {        while(1)+ \! \. l4 x" z: m! i7 w' j9 {
        {
1 t* K7 x1 J7 Z6 ~9 H                read_MSG_buffer(pshreRAM);
, @4 Q* M0 h3 X8 B# H+ m        }               
/ h- ~; R- I; y1 {}
" ]! D3 ~5 c8 N% ~% I. @$ N2 \" r$ s/ \8 ?$ s- S
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
& f+ p( c) W2 k( e( y. H: ~{
7 y$ M/ q' |, m- D+ }        RX_MSG_PROTOCOL buf;
8 r/ P5 j9 O6 W' Y        
- d5 V% B; P* B# p        buf.a = pshreRAM->a;* h0 ]# B$ W4 C
        buf.b = pshreRAM->b;
4 o! }" W% m  z: b        buf.packet_cout = pshreRAM->packet_cout;
5 Z- i6 C' M" p9 ^1 X& L6 E8 d        
+ x7 z. M0 \2 C6 B2 S; c4 c        if(buf.packet_cout != count_copy); S- |( K; l6 F, ~7 F2 ~3 I# Z
        {
" [8 b! @6 ]* C& _! U                printf("a is %d\n", buf.a);! N' U8 [8 m5 m9 g
                printf("b is %d\n", buf.b);% L4 u6 l& ?7 {2 p  [3 Z; |8 N
                printf("count is %d\n", buf.packet_cout);; @" u0 A: h1 J
                count_copy = buf.packet_cout;
7 K! q5 H. C: X/ ]. p& L0 y        }1 ]( e) S* n8 V3 l
        else
/ y( ]/ m4 l. Q        {) J) S$ e& G4 \
                printf("No effective message!");& A3 B% Y. {: ]3 l$ ^' m
        }9 h- {4 E; d' |% }$ _
}+ ^; x& [1 O2 I/ i: l' Z" F/ P3 x
, R* P3 `+ }. [0 [  W* |  {" j
& @0 p, W8 y( L# @/ [: ^$ S" q
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。7 J. p7 ~, Q- L" R+ \5 \6 \; E2 N
使用下面代码,对内存使用了mmap函数后:$ s. v# c. h0 [
#include <stdio.h>8 F- N/ _% A' D- ?9 w6 O8 q
#include <unistd.h>5 V& m" o* w. G* d5 V- V
#include <sys/mman.h>& w9 ~) e$ D7 M5 `, I* a& z9 n0 R
#include <sys/types.h>
$ w# Q+ t+ m+ I' f4 j#include <fcntl.h>
+ l6 C6 T" m: K% @( E
$ E& j) l' |3 W- h: c3 l, J#define SHAER_RAM_BASE_ADDR    (0x80000000)+ Q5 E- n' S( \) D; o1 ]8 c
#define SHAER_RAM_SIZE         (0x20000)   
9 Q% \+ {' R* G. e3 I' l) m
# X+ u* w' C* H, W% ~) w2 m& ?typedef struct! X: F! W  f! q. x9 M9 \1 d& X
{/ P; F( O2 G3 _- k: Z- z$ B. W
        unsigned int a;
, a$ W& U! {) V. D        unsigned int b;! W9 r8 G9 y3 c+ I4 W
        unsigned int packet_cout;
4 f% F& z. ]; ~. l  A9 D}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ w: x; u! F$ d
0 k' w: _6 f  N5 ]1 dvoid read_MSG_buffer(int *baseaddr);
8 Z! R8 y  m8 q8 m% ?unsigned int count_copy = 0;
6 D' Y6 N/ p$ h! T) F
% W8 O% U2 z3 h5 W; q# t  [int main(). _$ g: g* ^) c0 z
{; @0 r3 h3 M: S$ E5 J
        int fd;8 b- U+ R2 A  t1 p- P, U
        int *mem = NULL;! r' X) k( X9 _( E7 n% {
4 r! r0 Z& F2 I1 P
        if((fd = open("/dev/mem", O_RDWR)) <0)4 c: O8 V# M3 ]5 Y' ^) j1 v/ v
        {
) J) l1 l; G: t7 q+ V. z7 \8 n                perror("open error");
# n4 V" ?# A3 \/ y# F- R                return -1;
6 q  g) K" {7 a7 L" j6 E" W: b        }5 i3 H; F5 V  X/ A8 _$ b; D0 v
        * O, Y8 Z+ l7 ?* [- q$ Y
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);& y# f1 l+ Z& o9 M8 O- u1 c& f

7 q' D$ ^# ]; S5 T0 v4 P  s        while(1)
/ r5 E0 |7 |8 J9 Q; q        {
- N7 e7 D: T% O$ P# ]( t' z" H, M                read_MSG_buffer(mem);
$ Y  I/ ^  |- \0 m& p        }                9 ?1 H- }; M1 t2 B, m0 v6 _) c6 o
}
+ u! n& g$ @2 K  r
+ x3 p* L* B1 s8 l7 dvoid read_MSG_buffer(int *baseaddr)
- f3 ], _" I! K: V- A{
2 l/ Z- g9 K: A* ?        pRX_MSG_PROTOCOL pshreRAM = NULL;- ~1 J) U% [3 h$ Q0 p

" O7 H2 p. f2 }        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;) t2 P6 l2 _6 U; G! q4 p9 K
* H: J, W: M9 {/ X$ n$ M! R! G
        if(pshreRAM->packet_cout != count_copy)
# [/ m' w: J/ G* {3 ]6 |        {/ Q. u8 y" d4 a* X2 t; O! R
                printf("a is %d\n", pshreRAM->a);% N" |2 H" i; E; p+ z, }
                printf("b is %d\n", pshreRAM->b);
3 l# {% P; l  C3 @, p! z6 m                printf("count is %d\n", pshreRAM->packet_cout);: `- V1 n2 P9 ~
                count_copy = pshreRAM->packet_cout;
$ S& v7 [8 g' X. ?( v        }: Z/ z+ z. {: I* I
        else
. \. Z1 p# i& `! V. x, r        {5 F' m/ n1 R& ]/ j: O& x
                printf("No effective message!\n");9 H0 B+ f" m) [2 w. |4 ]) L0 o
        }6 ?' c* i( }: O$ A
}( v7 q& _8 t; V. E, G

; q4 P5 n& W- b( K' `! S! U0 m没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???" |" D6 }9 y, Z2 F+ Z' i

; a; l4 ?# \! n* ^2 `9 P2 e
( f# ~& L# j* E4 U6 X$ t( \
6 p$ Z( F( H7 m2 x: p8 H
% G4 {/ T6 d; F; x6 s4 s" F
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-6 19:03 , Processed in 0.040480 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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