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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ( p  N' Z5 i2 r& Y" b
' C- J9 v9 c4 q; z: h- z& p
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
4 l1 |0 ^9 R" Z, ]( l#include <unistd.h>
* h9 v: W* E* [9 a& v#include <sys/mman.h>
4 a* A( x) q6 `8 e0 }#include <sys/types.h>8 C) F. N( P" A) A
#include <fcntl.h>
+ H+ C+ g# T6 m
# p  I$ a3 c) Y- n/ s/ Y; m#define SHAER_RAM_BASE_ADDR    (0x80000000)   
, L% e6 K# L. v$ ~
# I: u1 b+ D# ]# y+ V- d5 ztypedef struct/ `6 G4 e2 b1 a! r. J8 U
{
- ]; Z( r% Q& n0 U& p* ~        unsigned int a;
* S( S! W  V9 t, m        unsigned int b;
6 K, b2 [- ?1 {( K  y: \        unsigned int packet_cout;1 R/ f: t1 ~: u! g
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, G' v9 [8 k7 z6 v/ [
, }; R2 m) L/ A- m* p; D$ B" O
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
2 I& K2 ?* y/ W4 Kunsigned int count_copy = 0;: o$ i* E5 a" v; _/ Y

# K, R% E, n: n. Q, u* k" n% B# N& M* `* F
int main()
; X  ]( s* e  D8 O5 g{
) @: h( ]" r5 t" E5 l( F7 q8 L3 W        pRX_MSG_PROTOCOL pshreRAM = NULL;
! f! l2 R3 h  e' K        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
% E5 }6 X+ d# [. V/ S/ D0 v. ^8 [2 i' w9 P! W% y# |  J6 G
        while(1)# C9 ]2 k/ N- A1 J) |# @5 _
        {
+ E- }* j- q; u8 ?# i  i                read_MSG_buffer(pshreRAM);- V, B0 G8 D3 }3 t
        }                " N  c0 Q% v5 b4 f( d
}
% t* n$ a# T( E! s3 f4 P
. D1 J8 a4 u7 m& q/ f# evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
5 S( g" I* Y* L& n! u- u: @, ~{4 \6 v+ }5 a" T2 v9 p. _
        RX_MSG_PROTOCOL buf;
# h6 s! \2 Y$ n/ ?) G6 W% ]4 Y        
1 O" O  F9 \& B7 Z7 N7 k        buf.a = pshreRAM->a;7 Y9 F1 u" L: A+ E
        buf.b = pshreRAM->b;- P% U, c4 L. y3 E" r; L$ O  z$ v
        buf.packet_cout = pshreRAM->packet_cout;
* I) U% v: l' Y0 X' G! u) R        
$ q2 t# c8 X, {# O+ c* I        if(buf.packet_cout != count_copy)
4 N2 E. d' X# u5 d, J  j! ]1 s$ {        {
8 E+ ~/ {7 f9 f  F                printf("a is %d\n", buf.a);
+ w$ y$ O3 n- j5 p                printf("b is %d\n", buf.b);  ^6 _; j7 D% |) S) ?
                printf("count is %d\n", buf.packet_cout);3 o6 v' T/ [1 B5 z$ X' d1 ~, g
                count_copy = buf.packet_cout;
. E  y4 E/ B9 x* \% F        }0 L' f# \; S- b
        else
, n8 C! I) z& @3 u6 F0 i        {
4 w- L. ]- q) {                printf("No effective message!");! _: f: b8 G5 r' m: t7 \# d+ T
        }
6 U9 y, `4 b3 m  _& Z  Z}
6 {5 o$ U' F: k  c* \" M! P" H/ w1 ~7 w! |# c  U) U
9 w- t4 C1 _0 Y1 D& T
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。9 {5 J# m2 @% z! i& [
使用下面代码,对内存使用了mmap函数后:
2 o& X8 Q* u9 g: k6 a. I* G3 z% a#include <stdio.h>: m6 W5 q7 [; v$ F
#include <unistd.h>7 z" W6 H! a8 Y. i! ^
#include <sys/mman.h>
* E- g; h3 A, d: o/ {2 E" c#include <sys/types.h>
( N6 I, q+ i8 ]2 R#include <fcntl.h>1 W7 L4 P1 S1 [/ E4 ]" v
( b' i4 f$ G' n. p
#define SHAER_RAM_BASE_ADDR    (0x80000000)
: o; Z, h4 H7 |% |8 U5 A#define SHAER_RAM_SIZE         (0x20000)   ) D/ }  e, v4 ^. e1 Q/ k4 u6 e
& e0 n6 y. b: `7 S5 k( F
typedef struct& K% \/ K; ~8 Y8 V6 m
{  T' ~7 R; c& r0 o6 L( I1 b
        unsigned int a;
. b" \" ]. ?5 R' E4 Q: R        unsigned int b;; T' x9 n0 n8 j# [
        unsigned int packet_cout;
3 @7 r9 R# W( |+ L- m3 ~}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;- B7 ^) v" a/ Z3 D. O7 A  [" m

- B0 d7 ~3 W# @+ `" h& ?void read_MSG_buffer(int *baseaddr);
# x) p' h/ N8 P8 D. punsigned int count_copy = 0;( o! u& g; `9 Y
" T" r% }! b- I; _1 o7 r
int main()
0 [: P: W, P7 J5 W1 u+ c, [{* G, @6 m" M  Q- X7 G' q0 t
        int fd;
! @6 x& A, V0 |# r( n  M; J        int *mem = NULL;
: V1 Z$ y) F4 T/ F8 ^; ~6 \; J/ S0 A
        if((fd = open("/dev/mem", O_RDWR)) <0)
( h: X! e' _( p' D  a2 I5 n9 e4 ~        {
# x7 T) z+ {- Z. }" n                perror("open error");; t: O* [0 c; k& ]& f; J
                return -1;
2 P  j, n( K* B# ]& h7 a        }
$ m% F4 _1 l4 [/ U7 a3 D% G0 c        
1 M$ e* y- f" }$ ?7 |& P        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);0 w! Y( j3 N/ T2 s) \

- Y1 j- t4 d9 r1 i9 l        while(1)
4 b2 c4 o0 B) V/ B5 [        {
  K8 Y' X; C4 V) G4 g1 h/ z$ S                read_MSG_buffer(mem);
8 D# v2 b3 P; i5 ?) F        }               
, n- p* w6 F/ |}
% Z) ?& q0 ~9 M/ H' v$ c$ E- ?4 ?7 Q$ w) z1 Z3 w9 D  m
void read_MSG_buffer(int *baseaddr)
# X  @. A4 p6 ^) Q- c& N1 Q* |{
% S. X& C4 T6 m0 R9 z; [% }" H) ^: {        pRX_MSG_PROTOCOL pshreRAM = NULL;
6 ^- ~) G* g) g/ A: H" ?2 U, b# ~9 l- a2 o) A: @; k! r: X
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
4 z2 U2 _  y7 Y4 H) c! e+ [+ H4 y7 V$ F+ l
        if(pshreRAM->packet_cout != count_copy)' b& v6 s6 _2 F  o. G7 P) R
        {
% `! E2 i- o* D                printf("a is %d\n", pshreRAM->a);( ]& ?: Z* S  `6 G0 r6 s' U3 n
                printf("b is %d\n", pshreRAM->b);
0 Z7 ~. J0 X/ Z2 N' s' P; @                printf("count is %d\n", pshreRAM->packet_cout);3 \# A- }8 O2 @4 j3 q
                count_copy = pshreRAM->packet_cout;
; B3 S3 O, F1 U        }5 _4 \9 e- \6 c3 G
        else# x+ i  `& N) \+ m
        {& J, {& v- \* k2 K5 e4 W# N
                printf("No effective message!\n");6 ?8 J( u) z  X- B& E8 T  ~) |* F
        }6 A; I) }; U1 l9 X& s( l
}
9 y; P" W8 C6 P4 H* u+ I3 B
( J' b5 D1 n3 f. e  j9 e6 N没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
. F& r3 u6 A) `8 G$ H
- g4 _5 Y7 m, E5 M8 Z3 X- k. C5 M& x; j
, ~/ r6 X5 Y3 |! q( J
2 k4 h' q4 x' b0 @3 @# C9 i5 j& ]7 }5 |/ A+ P! k  r. X) t
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-19 15:25 , Processed in 0.041051 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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