OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 % w4 {! u+ b1 r2 h

: B' J$ d, C' J* ]- y: qOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>8 J( D! Z1 t. P
#include <unistd.h>
0 J% Z% X9 B5 }; p/ q+ S6 W#include <sys/mman.h>. Z- y) h2 V" }( f$ R9 {
#include <sys/types.h>% p0 h& K8 ^( U
#include <fcntl.h>
9 G; O/ n! g% i& \0 x- a# {0 k6 b" ]0 N5 D4 e0 x; O! x2 {
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
2 B8 F; j0 F$ F0 p* ?
+ `) A1 T- O3 j  i/ G$ Btypedef struct4 T2 S! p7 K/ Q' B# Y
{' j' \6 b1 I' L2 r6 X! Q5 }7 `& p
        unsigned int a;. r- Y% u2 Q) g+ c* t( i
        unsigned int b;
# R2 Z& N" x) A& o( z! m: |        unsigned int packet_cout;5 N. i4 _& {1 z. [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ Q! n4 L4 {  C; Z: x; v- [: U7 `
. K, e% W! @/ N" D0 hvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);5 e4 k! z% ]0 g' {. d3 g/ v
unsigned int count_copy = 0;; M0 R& a. V1 y5 d9 @5 V

' h- h: y2 V2 Q" Z2 V1 \% a8 i+ p; a- V) m% W
int main()
8 i* i! W, b0 t" X# P" k9 \& e- p: `{  g3 \8 h4 ]5 E! R
        pRX_MSG_PROTOCOL pshreRAM = NULL;$ b, U+ K$ j. l! c" i
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;. x& v" J. r* Q! e* K' G0 V7 U9 k
- E4 i5 M0 T# \9 o
        while(1)
/ ~! E1 ^9 H8 n0 M$ S5 r  z$ x5 o        {
" b! p# b$ u& o, q% v                read_MSG_buffer(pshreRAM);
4 `3 f, d8 m7 `$ h+ E) l        }                9 ?" ~! X1 S7 v; V5 d5 y3 z
}
' N0 p0 _4 H8 e' F, ~; \+ P; s5 J! U/ ~( H* P  o, [
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)* ]( @, r1 k4 C- D8 V3 b" r. g
{
( n1 D& ^9 ~" Y' r        RX_MSG_PROTOCOL buf;
9 w# v- [9 B7 S1 I9 B        
# o: ~5 k$ p  q9 B        buf.a = pshreRAM->a;
9 k* r/ ?; v) a# V- d/ Z4 _1 N        buf.b = pshreRAM->b;
# [6 X4 o/ r$ R* z        buf.packet_cout = pshreRAM->packet_cout;- z; N' R7 Z4 g! y% z
        9 @' K5 ^, t+ G, Q% U, ~* W( ~  g
        if(buf.packet_cout != count_copy)
) c7 w' e5 P/ S. T0 i/ N        {
5 E) d+ j: C3 V! M) r9 z                printf("a is %d\n", buf.a);: }( w) s" i* \3 a; i
                printf("b is %d\n", buf.b);
+ [; Q% d" u1 ~% m                printf("count is %d\n", buf.packet_cout);
- [# v' H7 e) W- M9 v                count_copy = buf.packet_cout;
2 F% H* s9 C5 d7 i  @) ?( {7 j4 Z        }) _0 D9 F  D! ^
        else
8 C8 O$ S2 j: k8 F        {
" J. x) _& F, W2 r) [0 q                printf("No effective message!");; E* _" T: M6 M( ]5 ~( s
        }
6 K. K  U; I% H% K  k3 `% V}
( V0 W" O1 ]6 n6 F) z/ f) c, A' y* C

9 H4 W+ P  Z$ w! w- \$ q- K+ W7 ^6 r/ d但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% i# g7 b6 }' v! f( ]- R使用下面代码,对内存使用了mmap函数后:
3 l' x* x/ E% [#include <stdio.h>
5 Y0 R, P% x' {$ i7 q#include <unistd.h>
6 x, s7 [1 R" g/ {( U$ C#include <sys/mman.h>/ R- q" x' F  k, _  l) g/ [+ `8 p
#include <sys/types.h># i! a, j1 }* K8 U( Z% i9 X/ N
#include <fcntl.h>: D- }9 L$ B$ o$ E

2 w& r, U; |; X9 C1 N+ Y#define SHAER_RAM_BASE_ADDR    (0x80000000)! ]' x8 X8 m% @8 ~
#define SHAER_RAM_SIZE         (0x20000)   
+ M+ E* W. ]" ^! I( e7 ?
& D4 A- I' y; E3 stypedef struct
4 t/ h4 n7 f  n1 k3 D, n8 [6 S{
% v2 v+ o0 m) P2 S" @7 L        unsigned int a;3 Z. A/ K! k7 M. S' K
        unsigned int b;, d  w6 _1 W2 |7 {3 t
        unsigned int packet_cout;0 ?9 Z+ e  y& a7 R. x8 c9 E
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( Y6 G; h+ s9 V% U5 a/ S
* ?3 y1 `, n9 y4 `void read_MSG_buffer(int *baseaddr);
! l4 p2 Q0 N$ k( A' E# c  p/ u; wunsigned int count_copy = 0;
5 P( K3 D/ H" z0 V# B+ ~6 n2 \3 J$ O. R0 a4 C# [& q
int main()
1 S9 S9 y- q' m( E, k1 }{/ o  B' H6 w8 Q7 t! x
        int fd;6 D/ M/ |. e; M3 ?/ l  h
        int *mem = NULL;
% E; d3 q: i! H, G$ ~, |; h0 F1 q9 m& D5 y- S, U2 z* d
        if((fd = open("/dev/mem", O_RDWR)) <0)
, M# o3 q* p; M+ ]: B" t1 A        {
+ A9 t$ j! g) }6 ^" U  D+ X                perror("open error");% l/ |2 x+ l# r  r( x, B4 |7 b
                return -1;
( a% Y# `/ m( K/ K( M" I4 b% [8 S        }
* N  k: q. j( R- K; E        2 N# |0 c1 h" Q
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);3 I  ~5 d' Q4 E" t# ~( ~, M
: {  z3 y- u9 _1 Z& X8 Q- e
        while(1)
/ v* [4 U+ w( Y! ?2 @& F# C7 g        {2 k' d* s( e3 u. k! R5 L3 I- e4 u
                read_MSG_buffer(mem);
0 t/ ]* }% r% e1 A6 E; l        }               
$ v1 U- n! w) c( h9 U3 c- a* T}
! a5 z7 K( |2 v. N* t" ^( W$ x3 O! L/ h
void read_MSG_buffer(int *baseaddr)
( k$ _& H; Y, _  S1 ^{7 D0 @2 V. D1 R' n
        pRX_MSG_PROTOCOL pshreRAM = NULL;9 j9 o* H' `" ~4 T. N
3 s' A! i; N" J8 a6 H* m
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;1 k1 ?% w; W4 L2 Z% y8 \/ _' B

; z0 ?. b- u) L/ L4 X# V" |- |        if(pshreRAM->packet_cout != count_copy)
$ L5 R5 g4 t$ [: `        {
! |5 k) W0 z( G! l" y1 F$ _1 ^                printf("a is %d\n", pshreRAM->a);$ b2 c9 T4 Q" f$ D# u# h4 K
                printf("b is %d\n", pshreRAM->b);
2 \6 l+ V# F% f  `2 h                printf("count is %d\n", pshreRAM->packet_cout);& n3 B7 w# U" V) j# d5 J: g
                count_copy = pshreRAM->packet_cout;
9 F8 u9 y/ {- t+ r8 S        }' d1 l" e( w4 J2 X
        else
$ V: B  a' j8 a+ a        {. N, }) K1 C& A' R+ a# T" c
                printf("No effective message!\n");+ g2 v1 ~. g1 n- o! E0 J
        }. O" D2 N2 \/ ?. M  T+ t
}
1 h' c- K. ^4 e8 i9 N( A5 T- g4 `% e5 `- f) n
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
9 q1 ]7 ~' I# n* M# N8 o: h7 K4 s7 n# A' h

8 n0 ?5 |$ n4 C6 y$ u3 K% P, I+ {
' ~6 n  k$ I% o+ S8 T+ d1 u5 k" t* R
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-27 06:31 , Processed in 0.038940 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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